![]() |
AW: Optimierung von Pixel
Grob auf dem Tablet zusammengezimmert würde das so aussehen:
Delphi-Quellcode:
Var buf: PDWord;
I, x: integer; Begin For i := 0 to bmp.height - 1 do Begin Buf := bmp.scanline[i]; For x := 0 to bmp.width - 1 do Begin Buf^ := $FF000000 or HLSToRGB(...); Inc(buf); End; End; |
AW: Optimierung von Pixel
Zitat:
Delphi-Quellcode:
zu stellen. Ansonsten siehe meinen editierten Post.
pf32Bit
Zitat:
Delphi-Quellcode:
! Dann sollte man auch auf jeden Fall Neutral Generals Hinweis beachten. Dadurch wird der Code deutlich verständlicher. Und wie gesagt, sind die RGB Werte nicht in der korrekten Reihenfolge.
pf32Bit
Delphi-Quellcode:
müsste bei deinem Ansatz deshalb entsprechend angepasst werden.
HLSToRGB
|
AW: Optimierung von Pixel
Danke werde mir das mal alles zu gemüte führen
Hab das früher mit GetDiBits gemacht aber man glaubt es nicht ist auch nicht schneller als Scanline. (Hmm.. oder doch nicht) ![]() Hier mal noch etwas code wie ich die Daten fülle.
Delphi-Quellcode:
gruss
while BASS_ChannelIsActive(Channel) <> BASS_ACTIVE_STOPPED do begin
BASS_ChannelGetData(Channel, Pointer(Buffer), BASS_DATA_FFT512); for i := 0 to BUFFER_SIZE - 1 do begin Value := SQRT(SQRT(Buffer[i])); H := 0 + Value / 1.5; L := Value; Image1.Picture.Bitmap.Canvas.Pixels[ColumnCounter, BUFFER_SIZE - i] := HSLtoRGB(H, S, L); end; Inc(ColumnCounter); Progress := Trunc(100 * (BASS_ChannelGetPosition(Channel, BASS_POS_BYTE) / BASS_ChannelGetLength(Channel, BASS_POS_BYTE))); Form2.ProgressBar1.Position := Progress; Application.ProcessMessages; end; |
AW: Optimierung von Pixel
Zitat:
![]() |
AW: Optimierung von Pixel
Zitat:
gruss |
AW: Optimierung von Pixel
Hier was zum spielen.
Aber wie gesagt mit Pixel eine Qual.. Anhang gelöscht.. gruss |
AW: Optimierung von Pixel
|
AW: Optimierung von Pixel
Zitat:
|
AW: Optimierung von Pixel
Unter sehr leichtem Performaceverlust lässt sich Scanline auch ähnlich wie Pixels verwenden, wenn man sich eine kleine Helferprozedur bastelt.
Delphi-Quellcode:
Aufruf dann so:
procedure SetPixel(aBitmap: TBitmap; aX, aY: Integer; aColor: TColor);
var P: PRGBTriple; begin if aBitmap.Pixelformat <> pf24Bit then raise Exception.Create('Bitmap hat falsches Pixelformat (nicht 24-Bit).'); if (aX < 0) or (aX > aBitmap.Width) then raise Exception.Create('X-Koordinate liegt außerhalb des Bitmaps.'); if (aY < 0) or (aY > aBitmap.Width) then raise Exception.Create('Y-Koordinate liegt außerhalb des Bitmaps.'); P := aBitmap.Scanline[aY]; Inc(P, aX); P^.R := GetRValue(aColor); P^.G := GetGValue(aColor); P^.B := GetBValue(aColor); end;
Delphi-Quellcode:
Wenn man es direkt in seine Schleife baut, lässt sich halt das immer wieder erneute Abholen der Scanline vermeiden (zumindest innerhalb einer Zeile, und wenn man den Stride selber behandelt auch generell), und die Prüfungen fallen nur ein Mal an. Aber das hier düfrte dennoch etliche hundert Mal schneller als Pixels[] sein, bzw. kaum merklich langsamer als ohne die Krücken-Prozedur SetPixel().
while BASS_ChannelIsActive(Channel) <> BASS_ACTIVE_STOPPED do begin
BASS_ChannelGetData(Channel, Pointer(Buffer), BASS_DATA_FFT512); for i := 0 to BUFFER_SIZE - 1 do begin Value := SQRT(SQRT(Buffer[i])); H := 0 + Value / 1.5; L := Value; SetPixel(Image1.Picture.Bitmap, ColumnCounter, BUFFER_SIZE - i, HSLtoRGB(H, S, L)); end; Inc(ColumnCounter); Progress := Trunc(100 * (BASS_ChannelGetPosition(Channel, BASS_POS_BYTE) / BASS_ChannelGetLength(Channel, BASS_POS_BYTE))); Form2.ProgressBar1.Position := Progress; Application.ProcessMessages; end; Es kann sein, dass das Bild dann auf dem Kopf steht. Windows speichert Bitmaps nämlich auf dem Kopf, wenn ich mich nicht irre. Um das zu beheben müsste nur die Zeile
Delphi-Quellcode:
zu
P := aBitmap.Scanline[aY];
Delphi-Quellcode:
geändert werden.
P := aBitmap.Scanline[aBitmap.Height-aY-1];
|
AW: Optimierung von Pixel
Danke für deine Mühe.
Mit ein paar kleinen Änderungen funktioniert es ganz gut. BUFFER_SIZE von 160 um 1 decrementiert. Habe nun aber eine andere Farbe denke das liegt an pf24Bit. Zitat:
gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:39 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