AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Optimierung von Pixel

Ein Thema von EWeiss · begonnen am 7. Apr 2016 · letzter Beitrag vom 12. Apr 2016
Antwort Antwort
Seite 1 von 11  1 23     Letzte »    
EWeiss
(Gast)

n/a Beiträge
 
#1

Optimierung von Pixel

  Alt 7. Apr 2016, 19:16
Jemand ne Idee wie ich das beschleunigen kann?

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

Geändert von EWeiss (11. Jul 2019 um 16:44 Uhr)
  Mit Zitat antworten Zitat
CHackbart

Registriert seit: 22. Okt 2012
267 Beiträge
 
#2

AW: Optimierung von Pixel

  Alt 7. Apr 2016, 19:28
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Optimierung von Pixel

  Alt 7. Apr 2016, 19:45
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Optimierung von Pixel

  Alt 7. Apr 2016, 19:49
Canvas.Pixel macht bei JEDEM Aufruf einen API Call. Reine Schätzung, aber 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 Canvas.ScanLine doch: Einen Zeiger auf den Pixelbuffer des Bitmaps.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Optimierung von Pixel

  Alt 7. Apr 2016, 19:50
Canvas.Pixel macht bei JEDEM Aufruf einen API Call. Reine Schätzung, aber 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 Canvas.ScanLine doch: Einen Zeiger auf den Pixelbuffer des Bitmaps.
Werde mich mal schlau machen wie ich das umsetzen kann

Danke.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Optimierung von Pixel

  Alt 7. Apr 2016, 19:54
Werde mich mal schlau machen wie ich das umsetzen kann
Prinzipiell wie mit 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 pf24Bit . Das bedeutet, dass du pro Pixel ein R, G und B Byte hast. Bei pf32Bit kommt noch ein Alpha-Byte hinzu und alles unter 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
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Optimierung von Pixel

  Alt 7. Apr 2016, 19:58
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

HSLtoRGB(H, S, L);

Scanline zuweisen soll.

Delphi-Quellcode:
  Value := SQRT(SQRT(Buffer[i]));
  H := 0 + Value / 1.5;
  L := Value;
gruss

Geändert von EWeiss ( 7. Apr 2016 um 20:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Optimierung von Pixel

  Alt 7. Apr 2016, 20:04
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 PByte zu arbeiten, kannst du auch PDWord verwenden (der Speicher sollte eh aligned sein, weshalb du auch beim letzten Pixel mit dem 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;
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl ( 7. Apr 2016 um 20:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#9

AW: Optimierung von Pixel

  Alt 7. Apr 2016, 20:05
Guckst du hier: http://docwiki.embarcadero.com/CodeE...nLine_(Delphi)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Optimierung von Pixel

  Alt 7. Apr 2016, 20:06
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 11  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:04 Uhr.
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