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.111 Beiträge
 
Delphi XE2 Professional
 
#8

AW: Bitmap zeichen (gehts noch schneller?)

  Alt 29. Feb 2016, 13:17
Um überhaupt vergleichen zu können, würde ich erstmal die interpolationen in TGPGraphic abstellen. Dann die Frage warum überhaupt GDI+? Wenn du ein so hochauflösendes Bild hast, kannst du nicht auch SetStretchBLTMode HalfTone zum runterskalieren nehmen?

Benutz ich z.B. in meinem AsciiImage:
TGDIRenderContext.EndScene(Zeile 135)

Und so schauts aus:
AsciiImage for Delphi: GDI-Downsampling, FireMonkey and more!

EDIT: Vergiss nicht, dass du da bei GDI+ mitunter unsäglich viel konvertierst(Kann dir auch bei GDI passieren). Wenn die Pixel-Formate zwischen Source und Target nicht gleich sind, wird die source immer konvertiert beim Zeichnen! IIRC solltest du am besten mit 32bit Grafiken arbeiten.
zu: "würde ich erstmal die interpolationen in TGPGraphic abstellen"
ich hab alle Modi probiert:
InterpolationModeInvalid 270 ms
InterpolationModeDefault 270 ms
InterpolationModeLowQuality 270 ms
InterpolationModeHighQuality 325 ms
InterpolationModeBilinear 270 ms
InterpolationModeBicubic 620 ms
InterpolationModeNearestNeighbor 180 ms
InterpolationModeHighQualityBilinear 370 ms
InterpolationModeHighQualityBicubic 320 MS
Alle Zeiten für einmal zeichnen.
Dagegen StretchBlt 2 ms
Bringt also die benötigte Zeit nicht einmal ansatzweise in die Zeit für StretchBlt.

Und warum bin ich so spitz auf TGPBitmap bin, statt TBitmap?
Das Bild liegt idR als .jpg vor, kann aber auch als .png oder .tif oder .bmp sein.

Bisher habe ich z.B. .jpg entsprechend der untenstehenden "LoadBmpViaJPEG" geladen.
Zur Zeit benutze ich die untenstehende "LoadBmpViaGPBitmap"
Und dann hab ich die untenstehende "LoadGPBitmap" getestet.
Die jeweils benötigten Zeiten:
"LoadBmpViaJPEG" : 970 ms
"LoadBmpViaGPBitmap" 270 ms
"LoadGPBitmap" 319 µs

Da ich das Bild nur ausgeben kann, wenn ich es vorher lade, drängt sich das laden in eine TGPBitmap förmlich auf.
Deshalb möchte auch bei allem was folgt am liebsten mit TGPBitmap weitermachen.



Delphi-Quellcode:
FUNCTION LoadBmpViaJPEG(const Dsn:String):Int64;
var Jpg:TJpegImage; Bmp:TBitmap;
begin
   Result:=TimeStamp;
   Jpg:=TJPEGImage.Create;
   Bmp:=TBitmap.Create;
   Jpg.LoadFromFile(Dsn);
   Bmp.Assign(Jpg);
   Jpg.Free;
   Result:=TimeStamp-Result;
   Bmp.Free;
end;
Delphi-Quellcode:
FUNCTION LoadBmpViaGPBitmap(const Dsn:String):Int64;
var W,H:Integer; Image:TGPBitmap; Graphics:TGPGraphics; Bmp:TBitmap;
begin
   Result:=TimeStamp;
   Bmp:=TBitmap.Create;
   Image:=TGPBitmap.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:=TimeStamp-Result;
   Bmp.Free;
end;
Delphi-Quellcode:
FUNCTION LoadGPBitmap(const Dsn:String):Int64;
var I:Integer; Image:TGPBitmap;
begin
   Result:=TimeStamp;
   Image:=TGPBitmap.Create(Dsn);
   Result:=TimeStamp-Result;
   Image.Free;
end;
Zur Vollständigkeit:
Delphi-Quellcode:
FUNCTION TimeStamp:Int64;
asm
   rdtsc
   {$IFDEF CPUX64}
   shl rdx,32
   or rax,rdx
   {$ENDIF}
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 22:51 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