Delphi-PRAXiS
Seite 2 von 11     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Optimierung von Pixel (https://www.delphipraxis.net/188798-optimierung-von-pixel.html)

CHackbart 7. Apr 2016 19:07

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;

Zacherl 7. Apr 2016 19:10

AW: Optimierung von Pixel
 
Zitat:

Zitat von Neutral General (Beitrag 1334954)
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.

Exzellenter Hinweis, wenn man die Wahl hat auf
Delphi-Quellcode:
pf32Bit
zu stellen. Ansonsten siehe meinen editierten Post.

Zitat:

Zitat von CHackbart (Beitrag 1334955)
Grob auf dem Tablet zusammengezimmert würde das so aussehen

Auch nur bei
Delphi-Quellcode:
pf32Bit
! 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.
Delphi-Quellcode:
HLSToRGB
müsste bei deinem Ansatz deshalb entsprechend angepasst werden.

EWeiss 7. Apr 2016 19:13

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)
http://ksymeon.blogspot.de/2010/02/g...pixels-in.html

Hier mal noch etwas code wie ich die Daten fülle.

Delphi-Quellcode:
    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;
gruss

Zacherl 7. Apr 2016 19:20

AW: Optimierung von Pixel
 
Zitat:

Zitat von EWeiss (Beitrag 1334957)
Hab das früher mit GetDiBits gemacht

Die API kopiert ja soweit ich weiß auch nur den Inhalt des Bitmaps und du benötigst dann MSDN-Library durchsuchenSetDIBits zum Ändern. Bei der ScanLine Methode arbeitest du direkt mit dem internen Speicher. Ohne Kopieren und ohne zusäzliche API Aufrufe. Die Performance sollte deshalb noch deutlich höher sein.

EWeiss 7. Apr 2016 19:23

AW: Optimierung von Pixel
 
Zitat:

Zitat von Zacherl (Beitrag 1334959)
Zitat:

Zitat von EWeiss (Beitrag 1334957)
Hab das früher mit GetDiBits gemacht

Die API kopiert ja soweit ich weiß auch nur den Inhalt des Bitmaps und du benötigst dann MSDN-Library durchsuchenSetDIBits zum Ändern. Bei der ScanLine Methode arbeitest du direkt mit dem internen Speicher. Ohne Kopieren und ohne zusäzliche API Aufrufe. Die Performance sollte deshalb noch deutlich höher sein.

Danke für eure Hinweise werde mir das mal zurecht schrauben :)

gruss

EWeiss 7. Apr 2016 19:37

AW: Optimierung von Pixel
 
Hier was zum spielen.
Aber wie gesagt mit Pixel eine Qual..

Anhang gelöscht..

gruss

Rollo62 8. Apr 2016 06:33

AW: Optimierung von Pixel
 
Graphics32 ?

Neutral General 8. Apr 2016 07:16

AW: Optimierung von Pixel
 
Zitat:

Zitat von Zacherl (Beitrag 1334956)
Exzellenter Hinweis, wenn man die Wahl hat auf
Delphi-Quellcode:
pf32Bit
zu stellen. Ansonsten siehe meinen editierten Post.

Es gibt auch PRGBTriple für 24-Bit ;)

Medium 8. Apr 2016 08:09

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:
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;
Aufruf dann so:
Delphi-Quellcode:
    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;
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().

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:
P := aBitmap.Scanline[aY];
zu
Delphi-Quellcode:
P := aBitmap.Scanline[aBitmap.Height-aY-1];
geändert werden.

EWeiss 8. Apr 2016 10:36

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:

Es kann sein, dass das Bild dann auf dem Kopf steht.
Nein ist Ok..

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:08 Uhr.
Seite 2 von 11     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz