AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Alternative zu StretchBlt gesucht

Alternative zu StretchBlt gesucht

Ein Thema von Harry Stahl · begonnen am 5. Dez 2014 · letzter Beitrag vom 8. Dez 2014
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.362 Beiträge
 
Delphi 11 Alexandria
 
#1

Alternative zu StretchBlt gesucht

  Alt 5. Dez 2014, 19:07
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).
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.362 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Alternative zu StretchBlt gesucht

  Alt 7. Dez 2014, 15:34
Versuche noch einmal nachzufragen. Keiner eine Idee?
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.674 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Alternative zu StretchBlt gesucht

  Alt 7. Dez 2014, 16:11
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.362 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Alternative zu StretchBlt gesucht

  Alt 7. Dez 2014, 17:22
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?
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
654 Beiträge
 
#5

AW: Alternative zu StretchBlt gesucht

  Alt 7. Dez 2014, 18:54
Geht das hier nicht mehr?
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.674 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: Alternative zu StretchBlt gesucht

  Alt 7. Dez 2014, 19:07
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!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.362 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Alternative zu StretchBlt gesucht

  Alt 7. Dez 2014, 19:49
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;

Geändert von Harry Stahl ( 7. Dez 2014 um 19:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.362 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Alternative zu StretchBlt gesucht

  Alt 7. Dez 2014, 20:14
Edit: Bei dem Link von Jens01 stand etwas zur Qualität der Resample-Filter dabei, habe ich jetzt erst gesehen...
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.362 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Alternative zu StretchBlt gesucht

  Alt 7. Dez 2014, 20:25
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.
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
654 Beiträge
 
#10

AW: Alternative zu StretchBlt gesucht

  Alt 7. Dez 2014, 22:36
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.
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf