Delphi-PRAXiS
Seite 1 von 11  1 23     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)

EWeiss 7. Apr 2016 18:16


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

CHackbart 7. Apr 2016 18:28

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.

EWeiss 7. Apr 2016 18:45

AW: Optimierung von Pixel
 
Zitat:

Zitat von CHackbart (Beitrag 1334944)
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.

Kleine Anregung wie meinst das mit Pixelbuffer?
In wie weit ist das schneller.
Bei einer Mp3 18sec benötige ich gut 5sec um den Stream einzulesen.

Mit Pixel wohlbemerkt.

gruss

Zacherl 7. Apr 2016 18:49

AW: Optimierung von Pixel
 
Delphi-Quellcode:
Canvas.Pixel
macht bei JEDEM Aufruf einen API Call. Reine Schätzung, aber
Delphi-Quellcode:
Canvas.ScanLine
ist locker um den Faktor 1000 schneller (eher mehr). Dort schreibst du die Daten praktisch direkt in den internen Bitmapspeicher.

Einen Pixelbuffer brauchst du meiner Meinung nach nicht. Nichts anderes liefert
Delphi-Quellcode:
Canvas.ScanLine
doch: Einen Zeiger auf den Pixelbuffer des Bitmaps.

EWeiss 7. Apr 2016 18:50

AW: Optimierung von Pixel
 
Zitat:

Zitat von Zacherl (Beitrag 1334947)
Delphi-Quellcode:
Canvas.Pixel
macht bei JEDEM Aufruf einen API Call. Reine Schätzung, aber
Delphi-Quellcode:
Canvas.ScanLine
ist locker um den Faktor 1000 schneller (eher mehr). Dort schreibst du die Daten praktisch direkt in den internen Bitmapspeicher.

Einen Pixelbuffer brauchst du meiner Meinung nach nicht. Nichts anderes liefert
Delphi-Quellcode:
Canvas.ScanLine
doch: Einen Zeiger auf den Pixelbuffer des Bitmaps.

Werde mich mal schlau machen wie ich das umsetzen kann ;)

Danke.

gruss

Zacherl 7. Apr 2016 18:54

AW: Optimierung von Pixel
 
Zitat:

Zitat von EWeiss (Beitrag 1334948)
Werde mich mal schlau machen wie ich das umsetzen kann ;)

Prinzipiell wie mit
Delphi-Quellcode:
Pixels
, 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).

Achten musst du nur auf die Anzahl der Bits pro Pixel. Meistens ist das in Delphi benutze Format
Delphi-Quellcode:
pf24Bit
. Das bedeutet, dass du pro Pixel ein R, G und B Byte hast. Bei
Delphi-Quellcode:
pf32Bit
kommt noch ein Alpha-Byte hinzu und alles unter
Delphi-Quellcode:
pf24Bit
wird kompliziert, da du dann mit Bits rechnen musst (wirst du aber vermutlich nicht brauchen).

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:

EWeiss 7. Apr 2016 18:58

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:
  Value := SQRT(SQRT(Buffer[i]));
  H := 0 + Value / 1.5;
  L := Value;
gruss

Zacherl 7. Apr 2016 19:04

AW: Optimierung von Pixel
 
Zitat:

Zitat von EWeiss (Beitrag 1334951)
Scanline gibt ja die Farbe zurück
Ich muss sie aber zuweisen

Du kannst beides damit machen:
Delphi-Quellcode:
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;
Das füllt dein Bitmap in der Farbe rot.

Statt mit
Delphi-Quellcode:
PByte
zu arbeiten, kannst du auch
Delphi-Quellcode:
PDWord
verwenden (der Speicher sollte eh aligned sein, weshalb du auch beim letzten Pixel mit dem
Delphi-Quellcode:
pf24Bit
Format kein invalid-read bekommen solltest) und dann die einzelnen Farbwerte per Bitshifts reinpacken:
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;

Uwe Raabe 7. Apr 2016 19:05

AW: Optimierung von Pixel
 
Guckst du hier: http://docwiki.embarcadero.com/CodeE...nLine_(Delphi)

Neutral General 7. Apr 2016 19:06

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 13:36 Uhr.
Seite 1 von 11  1 23     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