tBGRABitmap mit gro0en Dateien

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
wichard
Beiträge: 7
Registriert: Mi 11. Dez 2013, 18:12

tBGRABitmap mit gro0en Dateien

Beitrag von wichard »

Ich benutze tBGRABitmap um über Scanline schnell Pixel lesen zu können um daraus OpenGL-Texturen zu machen.
Das funktioniert bei kleinen bis mittleren (bis 4000*2000 Pixel) Bildgrößen hervorragend und ist wohl nicht langsamer als bei Delphi.
Bei größeren Bildern scheint Scanline mit zunehmender Zeilenzahl einen Versatz einzuschleusen: die erzeugte Textur sieht dann verzerrt aus.
Bei sehr großen Bilden (12000*6000 Pixel) stürzt das Programm ab, ohne dass es auf meiner Except-Zeile landet.
Gibt es da einen Workaround?
Gibt es unter Lazarus außer tBGRABitmap.scanline noch eine andere Möglichkeit zum schnellen Picel-Zugriff?
Danke für eure Hilfe!

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: tBGRABitmap mit gro0en Dateien

Beitrag von Michl »

Diverse Pixel-Auslesevarianten (fürs Bitmap): http://wiki.freepascal.org/Fast_direct_pixel_access

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: tBGRABitmap mit gro0en Dateien

Beitrag von Scotty »

Ein Problem mit dem Wertebereich (Integer vs. Longword)?
Ansonsten sprichst du über 2.7GB Daten: Wie willst du die Daten in den Graphikspeicher bekommen? Böte sich vielleicht ein anderes Vorgehen an...

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: tBGRABitmap mit gro0en Dateien

Beitrag von Michl »

wichard hat geschrieben:Bei größeren Bildern scheint Scanline mit zunehmender Zeilenzahl einen Versatz einzuschleusen: die erzeugte Textur sieht dann verzerrt aus.
Bei sehr großen Bilden (12000*6000 Pixel) stürzt das Programm ab, ohne dass es auf meiner Except-Zeile landet.
Gibt es da einen Workaround?

Habe ich mal ausprobiert, kann das Verhalten nicht bestätigen. Bei mir funktioniert der Zugriff auch auf 12000 x 6000 Pixel große Bitmaps (mit ScanLine und ebenso mit TLazIntfImage) ohne Probleme. Evtl. hast Du nicht genügend Arbeitsspeicher bereitgestellt??

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: tBGRABitmap mit gro0en Dateien

Beitrag von Michl »

Scotty hat geschrieben:Ein Problem mit dem Wertebereich (Integer vs. Longword)?
Ansonsten sprichst du über 2.7GB Daten: Wie willst du die Daten in den Graphikspeicher bekommen? Böte sich vielleicht ein anderes Vorgehen an...

Sollte doch nur (bei 4Byte/Pixel) 275MB sein. Habe es auch mal als BMP gespeichert, sind dann (3Byte/Pixel) 206MB. Alles prima :)

Fürs Mappen auf ein OpenGL-Objekt sind die Bilder dann aber wahrscheinlich trotzdem viel zu groß...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: tBGRABitmap mit gro0en Dateien

Beitrag von Scotty »

Michl hat geschrieben:Sollte doch nur ... 275MB sein.
Ich bin zu doof, 'nen Taschenrechner zu bedienen ;-).
(Noch schlimmer ist, dass eine einfache Überschlagsrechnung hätte hilfreich gewesen sein können.)

wichard
Beiträge: 7
Registriert: Mi 11. Dez 2013, 18:12

Re: tBGRABitmap mit gro0en Dateien

Beitrag von wichard »

Das Problem mit den verzerrten Texturen lag wohl daran, dass die Opengl Version, die ich mit Lazarus benutze empfindlicher auf die Textur-formate reagiert. Wenn ich das Texturebild so mache, dass Breite und Höhe 2-er Potenzen sind, tritt die Verzerrung nicht mehr auf.
Statt mit der eigentlichem Scanline zu arbeiten, hole ich mir jetzt den Anfang der Pixel Daten als Pointer mit
scanline0:=bmp.RawImage.Data;
Mit diesem Pointer kann ich schnell auf jedes Pixel zugreifen, wenn ich noch berücksichtige, dass jede neue Pixel-Zeile auf Vielfache von 4 ausgerichtet ist.
Das Problem mit zu großen Bild-Dateien besteht immer noch, ich kann mich aber auf kleinere dateien beschränken.
Vielen Dank für eure Hilfe!
Wichard

Antworten