![]() |
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: ![]() 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). |
AW: Alternative zu StretchBlt gesucht
Versuche noch einmal nachzufragen. Keiner eine Idee?
|
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.
|
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? |
AW: Alternative zu StretchBlt gesucht
Geht das
![]() |
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! |
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; |
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...
|
AW: Alternative zu StretchBlt gesucht
Also nur zur Vervollständigung, vielleicht braucht das Jemand mal:
Delphi-Quellcode:
Allerdings dauert es deutlich länger als StretchBlt, das ist wohl derzeit nicht zu toppen.
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; |
AW: Alternative zu StretchBlt gesucht
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz