Mit den in der untenstehenden Test-Prozedur enthaltenen Prozeduren DrawBitmap und DrawGPBitmap zeichne ich eine Bitmap auf den Canvas einer maximierten Form.
Größe der Bitmap : 4000 x 3000 Pixel
Größe des Canvass : 1920 x 1000 Pixel
Meine Erwartung war, das das mit der GPBitmap (TGPGraphics.DrawImage) schneller geht als mit DrawBitmap (StretchBlt).
Ich habe folgende Zeiten gemessen, jeweils für 100 maliges Zeichnen:
DrawBitmap : 234 ms.
DrawGPBitmap: 31809 ms, also knapp 136 mal so lange.
Da ich mir kaum vorstellen kann, dass das DrawImage (immerhin
GDI+) so viel langsamer ist, als das StretchBlt, vermute ich, dass ich irgend etwas verkehrt mache.
Weiß jemand, wie man eine GPBitmap schnell ausgibt?
Das Bild kann hier [
URL="https://commons.wikimedia.org/w/index.php?curid=6558322"] heruntergeladen werden.
Delphi-Quellcode:
PROCEDURE TMain.Test;
//------------------------------------------------------------------------------
FUNCTION DrawBitmap(const Dsn:String; Count:Integer):Cardinal;
var I,W,H:Integer; Image:TGPImage; Graphics:TGPGraphics; Bmp:TBitmap;
begin
Bmp:=TBitmap.Create;
Image:=TGPImage.Create(Dsn);
W:=Image.GetWidth;
H:=Image.GetHeight;
Bmp.SetSize(W,H);
Graphics:=TGPGraphics.Create(Bmp.Canvas.Handle);
Graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);
Graphics.DrawImage(Image,MakeRect(0,0,W,H));
Graphics.Free;
Image.Free;
Result:=GetTickCount;
for I:=1 to Count do begin
SetStretchBltMode(Canvas.Handle,COLORONCOLOR);
SetBrushOrgEx(Canvas.Handle,0,0,nil);
StretchBlt(Canvas.Handle,0,0,ClientWidth,ClientHeight,
Bmp.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,SrcCopy);
end;
Result:=GetTickCount-Result;
Bmp.Free
end;
//------------------------------------------------------------------------------
FUNCTION DrawGPBitmap(const Dsn:String; Count:Integer):Cardinal;
var I:Integer; Image:TGPBitmap; Graphics:TGPGraphics;
begin
Image:=TGPBitmap.Create(Dsn);
Result:=GetTickCount;
for I:=1 to Count do begin
Graphics:=TGPGraphics.Create(Canvas.Handle);
Graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);
Graphics.DrawImage(Image,MakeRect(0,0,ClientWidth,ClientHeight));
Graphics.Free;
end;
Result:=GetTickCount-Result;
Image.Free;
end;
//------------------------------------------------------------------------------
// https://commons.wikimedia.org/w/index.php?curid=6558322
const Dsn='E:\Daten\DownLoads\PfauVonVorne.jpg';
var T1,T2:Cardinal;
begin
T1:=DrawBitmap(Dsn,100);
T2:=DrawGPBitmap(Dsn,100);
ShowMessage(IntToStr(T1)+#13+IntToStr(T2));
// Ausgabe
// DrawBitmap 234 ms bei 100 Durchläufen
// DrawGPBitmap 31809 ms bei 100 Durchläufen
end;