![]() |
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
Zitat:
|
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
Zu guter letzt noch die Feststellung, dass sich die WorkerThreads eigentlich nur bei ganz großen Dateien lohnen. Bei kleineren Bitmaps (alles so unter 4000 x 4000) ist der Thread-Verwaltungsaufwand wohl zu hoch, da ist das z.T. auch schon mal langsamer als nur eine Routine. Da man auf alle Worker-Threads warten muss, bevor man das Ergebnis zuweist, kann es sich evtl. auch etwas in die Länge ziehen, wenn eine CPU zu sehr belastet ist und daher einen Thread etwas blockiert..
Vielleicht sollte ich auch nicht alle zur Verfügung stehenden CPUs nutzen, sondern immer 1 oder 2 weniger, damit so evtl. die restlichen voll für meine Berechnungsaufgaben zur Verfügung stehen. Muss ich morgen noch mal testen... |
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
Zitat:
Delphi-Quellcode:
Viel Spaß beim weiteren Basteln.
function GDIPRotateFlipBitmap(ABitmap: tBitmap; Mode: RotateFlipType): Boolean;
var BM: tBitmap; GR: tGPGraphics; AGPBitmap: tGPBitmap; AStatus: Status; W: Integer; begin if Mode = RotateNoneFlipNone then begin Result := True; Exit; end; BM := tBitmap.Create; BM.Assign(ABitmap); AGPBitmap := tGPBitmap.Create(BM.Handle, 0); AGPBitmap.RotateFlip(Mode); > if ABitmap.Width <> ABitmap.Height then begin > W := ABitmap.Width; > ABitmap.Width := ABitmap.Height; > ABitmap.Height := W; > end; GR := tGPGraphics.Create(ABitmap.Canvas.Handle); GR.DrawImage(AGPBitmap, 0, 0); AStatus := GR.GetLastStatus; Result := (AStatus = OK); AGPBitmap.Free; BM.Free; GR.Free; end; |
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
Zitat:
Delphi-Quellcode:
procedure TForm34.Button1Click(Sender: TObject);
var bm: Tbitmap; Start, Stop: Cardinal; begin Start := GetTickCount; bm := TBitmap.Create; bm.Assign(image1.Picture.Bitmap); // GDIPRotateFlipBitmap (bm, Rotate90FlipY); bm := FastAARotatedBitmap(bm.Handle, 90.0, TColor($FFFF), true, true, false, 1.0); Image2.Picture.Bitmap.Assign(bm); Image2.Refresh; Stop := GetTickCount - Start; Caption := Format('%d ms', [Stop]); // 656 ms .. end; |
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
Zitat:
Ich habe darüber vor einiger Zeit mal ![]() Edit: Ich sehe gerade, Renate Schaaf hatte das auch schon geschrieben, incl. Code. Sorry für das Duplikat. |
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
Nachtrag der Vollständigkeit halber :)
Delphi-Quellcode:
function GDIPRotateFlipBitmap(ABitmap: tBitmap; Mode: RotateFlipType): Boolean;
var BM: tBitmap; GR: tGPGraphics; AGPBitmap: tGPBitmap; AStatus: Status; W: Integer; begin if Mode = RotateNoneFlipNone then begin Result := True; Exit; end; BM := tBitmap.Create; BM.Assign(ABitmap); AGPBitmap := tGPBitmap.Create(BM.Handle, 0); AGPBitmap.RotateFlip(Mode); if (ABitmap.Width <> ABitmap.Height) and > (Mode in [Rotate90FlipNone, Rotate270FlipNone, > Rotate90FlipX, Rotate270FlipX, > Rotate90FlipY, Rotate270FlipY, > Rotate90FlipXY, Rotate270FlipXY]) then begin W := ABitmap.Width; ABitmap.Width := ABitmap.Height; ABitmap.Height := W; end; GR := tGPGraphics.Create(ABitmap.Canvas.Handle); GR.DrawImage(AGPBitmap, 0, 0); AStatus := GR.GetLastStatus; Result := (AStatus = OK); AGPBitmap.Free; BM.Free; GR.Free; end; |
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
Zitat:
:zwinker: |
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
Wenn ich das eben richtig nachgelesen habe, kann man für Bitmap-Veränderungen auch die Intel-Prozessoren direkt ansteuern, was der Bearbeitung noch mal Schub verleihen soll.
![]() ![]() Ich weiß nur nicht genau, wie man den Header ansteuert. :shock: |
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
Zitat:
Delphi-Quellcode:
, aber bei dem Größenbug von FlipRotate ist der Status OK. Und selbst wenn man das tBitmap.Create wegläßt, knallt es nicht.
if AStatus = OK
Aber vielleicht übersehe ich ja etwas. |
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
Zitat:
Nur die Funktion im GDITest Projekt spiegelt das Bild es wird nicht korrekt dargestellt.
Delphi-Quellcode:
GDIPRotateFlipBitmap (bm, Rotate90FlipY);
Delphi-Quellcode:
GDIPRotateFlipBitmap (bm, Rotate90FlipNone);
wäre korrekt! Ist zwar schnell aber das Ergebnis zu meiner Funktion ist nur schlecht. Vergleiche beide Bilder ![]() Das vergleichen kann man hier vergessen da die Konvertierung des Bitmap (*.png) zu *.jpg (Hier im Forum) das original verfälscht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:21 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