![]() |
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
Zitat:
Ich habe gerade Harrys Beispiel-Bild in vier 90-Grad-Schritten gedreht, und das Ergebnis ist identisch mit dem Ausgangsbild (Vergleich aller Pixel). |
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
Zitat:
Gruß, Renate |
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
Umwandeln in 32 Bit und dann damit arbeiten macht den Code natürlich einfacher. (kein Align und Dergleichen)
Und das Kopieren der Pixel düfte in 32 Bit auch schneller sein. (kopieren ganzer und vor allem ausgerichteter Integer). Wenn man es am Ende 32 Bit lässt (erstpart das Rückumwandeln), dann müsste man mal sehn, ob das Umwandeln von 24->32 Bit das Zeitplus des optimierten/einfacherem Codes für 32 Bit nicht auffrisst. Nja, du mußt für die Berechnungen halt immer den richtigen Zeilenanfang benutzen. * man könnte ein Array mit den Anfängen aufbauen, jeweils aus .Scanline[] * oder du nimmst die letzte Zeile und mußt aber für die Zeilenbreite den ausgerichteten/aufgerundeten Wert benutzen
Delphi-Quellcode:
Das ScanLine[] in der Schleife braucht es auch nicht, denn Quell- und Zielpixel lassen sich gleichermaßen direkt von der letzten Zeile aus berechnen.
//LineWidth := RoundUp(LineWidth / 4) * 4;
//LineWidth := Trunc(/LineWidth + 3) / 4) * 4; LineWidth := (LineWidth + 3) and not 3;
Delphi-Quellcode:
Pos = (X * LineWidthInByte) + (Y * PixelSizeInByte)
Ein INC mit den typisierten Zeigern ist nicht so praktisch, wenn man da das Align einbeziehen muß (bei 24 Bit), aber über einen Cast nach PByte ließe sich das Problem lösen.
Delphi-Quellcode:
Inc(PByte(Sourc), PixelSizeInByte);
Inc(PByte(Dest), LineWidthInByte);
Delphi-Quellcode:
(falls ich mich nicht vertan hab)
// für 24 Bit
Last := Scanline[Height - 1]; for Y := Height - 1 downto 0 do begin Src := Last - (Y * (Width * 3) + 3) and not 3; // oder Src := Last; vor die Y-Schleife und nach der X-Schleife ein Inc(PByte(Src), Die0bis3AlignBytes); bzw. Src auf den nächsten Integer aufrunden Dst := Last + Y * 3; for X := Width - 1 downto 0 do begin Dst^ := Src^; Inc(PByte(Src), 3); Dec(PByte(Dst), Width * 3); // bzw. die Pointer als Byte-Typ mit Pointerarithmetik und dafür der Cast beim Kopieren -> PRGBTripple(Dst)^ := PRGBTripple(Src)^; end; end; // für 32 Bit (das Auskommentierte für Byte-Typen) Last := Scanline[Height - 1]; for Y := Height - 1 downto 0 do begin Src := Last - Y * Width {* 4}; // oder Src := Last; vor die Y-Schleife ... die Zeilen liegen ja alle sowieso direkt hintereinander Dst := Last + Y {* 4}; for X := Width - 1 downto 0 do begin Dst^ := Src^; Inc(Src {, 4}); Dec(Dst, Width {* 4}); end; end; |
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
Zitat:
Mit Deiner letzten Ergänzung dauert es ca. 9,3 Sekunden, um die große Welt-Grafik zu drehen (24-Bit Fassung), die 32-Bit-Fassung geht allerdings genau so schnell wie Deine alte Fassung... |
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
Zitat:
|
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
Zitat:
Aber auch bei kleineren Grafiken gewinnt man speed, wenn bei kleinen Bildern (in der Höhe < 5000 Pixel) nur 2 CPUs verwendet werden, auch da ist die Worker-Thread Variante dann die schnellste Lösung (alle anderen Lösungen brauchen bei der kleineren Grafik so 130 -250 MS, die Worker-Thread-Varinate 80-130 MS). Bei mehr CPUs wird es bei steigender Anzahl der verwendeten CPUS bei kleineren Grafiken immer langsamer, da ist dann der Verwaltungsaufwand zu groß). |
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
Zitat:
Ansonsten habe ich mir mal eine große Bitmap mit den von dir angegebenen Dimensionen erzeugt. Da bekomme ich ständig OutOfResources-Fehler. Und was das Tempo anbelangt, so dürfte es doch zwischen alter und neuer Fassung keinen großen Unterschied geben - da ist doch nur die eine If-Abfrage dazugekommen (auch wenn Abfragen auf Mengen wohl nicht so schnell sind). Und: Mich würde interessieren, wie du 24 in 32 bit umwandelst. |
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
[QUOTE=striderx;1475851]
Zitat:
1. Ich setze bei der Bitmap das Pixelformat auf pf32bit; 2. Ich rufe eine eigene Funktion "SetVisibleRGBAMask" auf, die einfach nur alle Alpha-Werte auf 255, also sichtbar schaltet. 3. Dann setze ich Bitmap.Alphaformat auf afDefined Warum fragst Du? |
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
[QUOTE=Harry Stahl;1475912]
Zitat:
|
AW: 24-Bit Bitmap um 90 grad drehen - Resourcen-Optimierung
[QUOTE=striderx;1475928]
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:40 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