Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Alternative zu StretchBlt gesucht (https://www.delphipraxis.net/183034-alternative-zu-stretchblt-gesucht.html)

Harry Stahl 5. Dez 2014 18:07

Alternative zu StretchBlt gesucht
 
Hallo, kennt jemand noch eine gute UND schnelle Alternative zur Windows API-Funktion StretchBlt?

Google-Suche brachte nur das hier zu Tage:

http://swissdelphicenter.ch/de/showcode.php?id=1946

Die dort dargestellte Funktion ist zwar wirklich schnell, aber die Qualität ist im Vergleich zu StretchBlt sichtbar schlechter. Verwenden möchte ich das mit einem TBitmap, Graphics32 wäre wohl da keine Hilfe (davon abgesehen habe ich es dort nicht geschafft ein Stretch aufzurufen).

Harry Stahl 7. Dez 2014 14:34

AW: Alternative zu StretchBlt gesucht
 
Versuche noch einmal nachzufragen. Keiner eine Idee?

Medium 7. Dez 2014 15:11

AW: Alternative zu StretchBlt gesucht
 
Wo ist das Problem dabei, die Graphics32 einzusetzen? Du kannst ein Bitmap ziemlich zügig in ein TBitmap32 bringen, welches im Gegenzug u.a. auch direkt auf einen beliebigen Canvas gezeichnet werden kann. Ich nutze bei mir intern mittlerweile fast nur noch TBitmap32, allein schon weil die Lib so dermaßen viele Möglichkeiten mehr bietet, und praktisch alle Operationen zig mal schneller sind als alles was die WinAPI so bietet. Und gerade beim Resamplen hat man sogar noch die Wahl zwischen viel besseren Filtern als Nearest-Neighbour und stumpem bilinearen Interpolieren.

Harry Stahl 7. Dez 2014 16:22

AW: Alternative zu StretchBlt gesucht
 
Graphics 32 hatte ich mal ein Stretching / Resample probiert, aber nicht hinbekommen. Die Beispiele, die man im Netz findet, beziehen sich alle auf eine ältere Version von Graphics32.

Hast Du evtl. ein funktionierendes Beispiel für ein Resample einer TBitmap(32) mit GRaphics 32?

Jens01 7. Dez 2014 17:54

AW: Alternative zu StretchBlt gesucht
 
Geht das hier nicht mehr?

Medium 7. Dez 2014 18:07

AW: Alternative zu StretchBlt gesucht
 
Schau dir mal das Beispiel unter \graphics32\Examples\Vcl\Resampling\Resamplers_Ex\ an. Ich gebe zu, dass die Hilfe der GR32 hier recht unbrauchbar ist, und dass das Verfahren deutlich zur alten Version verkompliziert wurde. Vor allem scheint es keine fertigen DrawResized() Methoden o.ä. zu geben, sondern man muss eine Resampler-Klasse mit seinem Bitmap verknüpfen, und mit deren Hilfe selbst in einem Schleifchen seine Pixel zeichnen.
Ich muss gestehen, ich hatte auch noch die alte Version im Hinterkopf, da ich mit der neuen bisher noch keine Resizes benötigt hatte.

In dem o.g. Beispiel ist vor allem die Methode ScrChanged() interessant, dort wird genau diese Schleife gemacht. Ansonsten sind die Ereignishandler zu den Auswahllisten wichtig, in denen die entsprechenden Resampler erzeugt und parametriert werden. Scheint alles sehr mächtig geworden zu sein, für einfach mal gefiltert vergrößern aber doch etwas überladener als ich dachte :?. Das meiste wird man davon wohl gar nicht brauchen für dein Vorhaben.

Edit: Ha, der Link von Jens ist prima! Da wird das ja doch auf das nötigste eingedampft. Genau sowas hätte ich mir in der Hilfe-Datei auch gewünscht!

Harry Stahl 7. Dez 2014 18:49

AW: Alternative zu StretchBlt gesucht
 
Vielen Dank Euch Beiden!

Ja, mit dem Link vom Jens01 kam ich zurecht.

Der TLanczosKernel Resample-Filter ist nicht ganz so schnell, werde mal testen, ob in der gegebenen Situation die temporäre Verwendung eines TBitmaps32 eine Steigerung der Geschwindigkeit insgesamt bewirken kann.

Welches ist ein noch guter aber auch schneller Resample-Filter?

Kann man eigentlich mit einer Bitmap32 direkt auf den Windows-Canvas (z.B. einer Paintbox) zeichnen?

Hier mal kurz eine Möglichkeit das Bitmap in die TBitmap32 zu bekommen und das Ergebnis wieder in eine normale Bitmap zurück zugeben. Vielleicht kann man das noch optimieren?

Delphi-Quellcode:

procedure DrawSrcToDst(Src, Dst: TBitmap32);
var
  R: TKernelResampler;
begin
  R := TKernelResampler.Create(Src);
  R.Kernel := TLanczosKernel.Create;
  Dst.Draw(Dst.BoundsRect, Src.BoundsRect, Src);
end;

procedure TForm3.Button5Click(Sender: TObject);
var
  winbit1, winbit2: TBitmap;
  GR32bitSrc, GR32bitDest: TBitmap32;
begin
  WinBit1 := TBitmap.Create;
  WinBit2 := TBitmap.Create;

  WinBit1.LoadFromFile ('\\ew1\D\APic\PixPD\Market_Colors.bmp');

  GR32BitSrc := TBitmap32.create;
  Gr32BitSrc.Assign(WinBit1);

  GR32bitDest := TBitmap32.create;
  GR32bitDest.SetSize(GR32BitSrc.Width div 2, GR32BitSrc.Height div 2); // Bild auf die Hälfte

  DrawSrcToDst(GR32bitSrc, GR32BitDest);

  image2.Picture.bitmap.Assign(GR32BitDest);

  //.... diverse frees

end;

Harry Stahl 7. Dez 2014 19:14

AW: Alternative zu StretchBlt gesucht
 
Edit: Bei dem Link von Jens01 stand etwas zur Qualität der Resample-Filter dabei, habe ich jetzt erst gesehen...

Harry Stahl 7. Dez 2014 19:25

AW: Alternative zu StretchBlt gesucht
 
Also nur zur Vervollständigung, vielleicht braucht das Jemand mal:

Delphi-Quellcode:
procedure DoStretch (Const src: TBitmap; dst: TBitmap);
var
  //R: TKernelResampler;
  R: TLinearResampler;
  GR32bitSrc, GR32bitDest: TBitmap32;
begin
  GR32BitSrc := TBitmap32.create;
  Gr32BitSrc.Assign(src);

  GR32bitDest := TBitmap32.create;
  GR32bitDest.SetSize(dst.width, dst.Height);

  R := TLinearResampler.Create(GR32BitSrc);
  //R.Kernel := TLanczosKernel.Create;
  GR32bitDest.Draw(GR32bitDest.BoundsRect, GR32bitSrc.BoundsRect, GR32bitSrc);

  dst.Assign(GR32BitDest);

  GR32BitSrc.Free;
  GR32bitDest.Free;
end;
Allerdings dauert es deutlich länger als StretchBlt, das ist wohl derzeit nicht zu toppen.

Jens01 7. Dez 2014 21:36

AW: Alternative zu StretchBlt gesucht
 
Zitat:

Allerdings dauert es deutlich länger als StretchBlt, das ist wohl derzeit nicht zu toppen.
Liegt das vielleicht am Resampler? Der TNearestResampler soll am schnellsten sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz