tBGRABitmap mit gro0en Dateien
tBGRABitmap mit gro0en Dateien
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!
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!
Re: tBGRABitmap mit gro0en Dateien
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;
-
- 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
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...
Ansonsten sprichst du über 2.7GB Daten: Wie willst du die Daten in den Graphikspeicher bekommen? Böte sich vielleicht ein anderes Vorgehen an...
Re: tBGRABitmap mit gro0en Dateien
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;
Re: tBGRABitmap mit gro0en Dateien
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;
-
- 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
Ich bin zu doof, 'nen Taschenrechner zu bedienen .Michl hat geschrieben:Sollte doch nur ... 275MB sein.
(Noch schlimmer ist, dass eine einfache Überschlagsrechnung hätte hilfreich gewesen sein können.)
Re: tBGRABitmap mit gro0en Dateien
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
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