![]() |
Optimierung von Pixel
Jemand ne Idee wie ich das beschleunigen kann?
Delphi-Quellcode:
Image1.Picture.Bitmap.Canvas.Pixels[ColumnCounter, BUFFER_SIZE - i] := HSLtoRGB(H, S, L);
Bei einer Bitmap weite von 17507 kann das ganz schön lange dauern bis ich da durch bin. gruss |
AW: Optimierung von Pixel
Probier mal Scanline, oder noch besser: Erstelle einen eigenen Pixelbuffer: Breite x Höhe * 4 und zeichne das erst dort rein und kopiere es dann in das Image.
|
AW: Optimierung von Pixel
Zitat:
In wie weit ist das schneller. Bei einer Mp3 18sec benötige ich gut 5sec um den Stream einzulesen. Mit Pixel wohlbemerkt. gruss |
AW: Optimierung von Pixel
Delphi-Quellcode:
macht bei JEDEM Aufruf einen API Call. Reine Schätzung, aber
Canvas.Pixel
Delphi-Quellcode:
ist locker um den Faktor 1000 schneller (eher mehr). Dort schreibst du die Daten praktisch direkt in den internen Bitmapspeicher.
Canvas.ScanLine
Einen Pixelbuffer brauchst du meiner Meinung nach nicht. Nichts anderes liefert
Delphi-Quellcode:
doch: Einen Zeiger auf den Pixelbuffer des Bitmaps.
Canvas.ScanLine
|
AW: Optimierung von Pixel
Zitat:
Danke. gruss |
AW: Optimierung von Pixel
Zitat:
Delphi-Quellcode:
, nur dass du jetzt jeweils eine Zeile des Bitmaps direkt füllen kannst (eventuell würde es sogar gehen mit dem Pointer der 1. Zeile sämtliche Daten zu schreiben, aber da Bitmapdaten auch nicht-durchgehend sein können [Strides], würde ich das vermutlich nicht riskieren).
Pixels
Achten musst du nur auf die Anzahl der Bits pro Pixel. Meistens ist das in Delphi benutze Format
Delphi-Quellcode:
. Das bedeutet, dass du pro Pixel ein R, G und B Byte hast. Bei
pf24Bit
Delphi-Quellcode:
kommt noch ein Alpha-Byte hinzu und alles unter
pf32Bit
Delphi-Quellcode:
wird kompliziert, da du dann mit Bits rechnen musst (wirst du aber vermutlich nicht brauchen).
pf24Bit
Achso. Die Reihenfolge der Farben war nicht RGB, soweit ich mich erinnere. Da bin ich schon öfters drauf reingefallen, aber leider habe ich die korrekte Reihenfolge trotzdem schon wieder vergessen :-D :stupid: |
AW: Optimierung von Pixel
scheint wieder nicht so einfach zu sein .. ;)
Na wird schon irgend wie .. LOL Scanline gibt ja die Farbe zurück Ich muss sie aber zuweisen Hmm bin mir jetzt nicht klar darüber wie ich
Delphi-Quellcode:
HSLtoRGB(H, S, L);
Scanline zuweisen soll.
Delphi-Quellcode:
gruss
Value := SQRT(SQRT(Buffer[i]));
H := 0 + Value / 1.5; L := Value; |
AW: Optimierung von Pixel
Zitat:
Delphi-Quellcode:
Das füllt dein Bitmap in der Farbe rot.
var
B: TBitmap; X, Y: Integer; P: PByte; begin B := TBitmap.Create; try B.PixelFormat := pf24Bit; B.Width := 200; B.Height := 200; for Y := 0 to B.Height - 1 do begin P := B.ScanLine[Y]; for X := 0 to B.Width - 1 do begin P^ := 0; Inc(P); P^ := 255; Inc(P); P^ := 0; Inc(P); end; end; Canvas.Draw(0, 0, B); finally B.Free; end; end; Statt mit
Delphi-Quellcode:
zu arbeiten, kannst du auch
PByte
Delphi-Quellcode:
verwenden (der Speicher sollte eh aligned sein, weshalb du auch beim letzten Pixel mit dem
PDWord
Delphi-Quellcode:
Format kein invalid-read bekommen solltest) und dann die einzelnen Farbwerte per Bitshifts reinpacken:
pf24Bit
Delphi-Quellcode:
var
B: TBitmap; X, Y: Integer; P: PDWord; begin B := TBitmap.Create; try B.PixelFormat := pf24Bit; B.Width := 200; B.Height := 200; for Y := 0 to B.Height - 1 do begin P := B.ScanLine[Y]; for X := 0 to B.Width - 1 do begin P^ := (0 shl 8) or (255 shl 16) or (0 shl 24); P := PDWord(PByte(P) + 3); // 3 byte per pixel for pf24Bit end; end; Canvas.Draw(0, 0, B); finally B.Free; end; end; |
AW: Optimierung von Pixel
Guckst du hier:
![]() |
AW: Optimierung von Pixel
Noch ein Hinweis:
Pixelformat auf 32-Bit stellen und P nicht als PByte definieren sondern als PRGBQuad. Das ist ein Pointer auf ein Record mit den RGBA werten. Da musst du dir keine Gedanken über die Reihenfolge machen. Und mit einem inc(P) bist du dann auch automatisch direkt 1 Pixel weiter. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:09 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