Autor Beitrag
Sidi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47


Delphi XE5 Prof.
BeitragVerfasst: Do 16.02.06 19:41 
Hallo zusammen,

wer hat Erfahrung mit resample.pas von Anders Melander? Gibt es Beispiele zur Verwendung von procedure Stretch(Src, Dst: TBitmap; filter: TFilterProc; fwidth: single); und den Filtern?

Gruß Klaus
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Do 16.02.06 21:30 
Es gibt in der Suche in: Delphi-Library GDI+ ein Tut zu GDI+. Ist zwar nicht mit einem Funktionsaufruf getan aber sehr schnell da hardwarebeschleunigt.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 17.02.06 04:12 
Die Unit ist mathematisch zum Teil etwas fehlerhaft (die Gewichte addieren sich nicht exakt zu 1), lässt sich aber korrigieren.

Die Anwendung sollte eigentlich selbsterklärend sein (sofern du Englisch verstehst):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  // Interpolator
  // Src: Source bitmap
  // Dst:   Destination bitmap
  // filter: Weight calculation filter
  // fwidth: Relative sample radius
  procedure Stretch(Src, Dst: TBitmap; filter: TFilterProc; fwidth: Extended);

Man gibt Source und Destination Bitmaps an, die Filterprozedur, und den Sample Radius (Genauigkeit).

PS: Der Lanczos3-Filter liefert die besten Resultate. Ich poste hier noch meinen, es ist im Prinzip der Lanczos3-Filter im Quadrat mit einem eingebauten Schärfefilter. Ist jedoch nicht mehr so Universell einsetzbar wie der Lanczos3 Filter: Ist nur geeignet zum Verkleinern und ist ungeeignet bei Bildern mit sehr vielen dünnen Linien. Bei Fotos ist das Resultat jedoch oft schärfer und bildet weniger Artefakte um scharfe Kanten.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function TyFilter(Value: Extended): Extended;
begin
  if (Value < 3) then
    Result := (-sqr(SinC(Value-1)*SinC((Value-1)/3))+
                8*sqr(SinC(Value)*SinC(Value/3))+
               -sqr(SinC(Value+1)*SinC((Value+1)/3)))/6
  else
    Result := 0.0;
end;
Sidi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47


Delphi XE5 Prof.
BeitragVerfasst: Fr 17.02.06 22:13 
Hallo delfiphan,

der verwendete Programmierstiel ist für mich ungewohnt, deshalb war mir nicht ganz klar wie stretch das veränderte Bild wieder übergibt. Ich habe es jetzt jedoch hinbekommen :-)

Stretch(QBMP,ZBMP,ResampleFilters[5].Filter,ResampleFilters[5].Width);
JPEG.Assign(ZBMP);

Das Ergebnis ist erstaunlich gut, ich habe ein Bild mit resample und mit PhotoImpact auf die selben Werte verkleinert und vergrößert und das Resultat war mit bloßem Auge betrachtet nahezu identisch.

Die Genauigkeit ist doch in der Constanten resamplefilters dem jeweiligen Filter bereits zugeordnet, kann man diese Werte als Optimum ansehen oder haben sich andere Werte besser bewährt?

Gruß Klaus