AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Bitmap zeichen (gehts noch schneller?)
Thema durchsuchen
Ansicht
Themen-Optionen

Bitmap zeichen (gehts noch schneller?)

Ein Thema von Amateurprofi · begonnen am 28. Feb 2016 · letzter Beitrag vom 1. Mär 2016
 
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.087 Beiträge
 
Delphi XE2 Professional
 
#1

Bitmap zeichen (gehts noch schneller?)

  Alt 28. Feb 2016, 12:45
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;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
 


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 07:47 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