TImage/Bitmap zu groß?

Antworten
Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

TImage/Bitmap zu groß?

Beitrag von Komoluna »

Liebes Forum,

Mein Programm hat ein Problem beim abspeichern eines Bildes TImage:
das Image hat eine Größe von 15000x15000 Pixeln, aber wenn ich versuche es mit

Code: Alles auswählen

PaintImage.Picture.SaveToFile(afilepath);
oder

Code: Alles auswählen

PaintImage.Picture.Bitmap.SaveToFile(afilepath);
abzuspeichern wird immer eine "Exception Klasse >"RunError(203)"< ausgelöst"...
wenn man dann auf fortsetzen klickt kommt der nächste Fehler: "Out of Memory". (Am Arbeitsspeicher sollte es eig. nicht liegen Ich hab 16 GB und mein OS(Win7) unterstützt das auch...)
Es liegt definitiv an der Größe (ich habe es auch mit kleineren Bildern getestet, und da funktioniert das prima).

Also: Wie kann ich mein Bild trotzdem Speichern???
(zur Not auch auf Umwegen... Ich brauche genau diese Größe...)

Vielen Dank schonmal im Voraus...
MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

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: TImage/Bitmap zu groß?

Beitrag von Scotty »

Das hier geht unter Linux mit 64bit und 32bit (dauert dann aber ewig). Raus kommt eine Datei mit ~650MB.

Code: Alles auswählen

  with TBitmap.Create do
  try
    Height:=15000;
    Width:=15000;
    SaveToFile('test.bmp');
  finally
    Free;
  end;
 

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TImage/Bitmap zu groß?

Beitrag von m.fuchs »

Ist dein Programm 32 oder 64 Bit?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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: TImage/Bitmap zu groß?

Beitrag von Scotty »

Ich dachte an eben diesen Unterschied (wobei die Hypothese bei 650MB kaum eine Überlegung wert ist). Deshalb habe beide Varianten ausprobiert (wie geschrieben).

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: TImage/Bitmap zu groß?

Beitrag von Komoluna »

das problem scheint nicht am speichern direkt zu liegen, sondern am Bild, denn wenn ich statt des TImage auf ein TBitmap zeichne, und das dann abspeichere
kommt der selbe Fehler...
überhaupt ist jedweder lesezugriff auf das Canvas des Bitmaps unmöglich und erzeugt einen "RunError(203)"...
was mich dann jedoch wundert, ist, dass das Programm das Bild vom TImage ja angezeigt hat(also Lesezugriff möglich), aber man kann es nicht abspeichern,
und nicht in ein anderes TImage oder TBitmap kopieren(auch lesezugriff...)...

vlt. liegt es daran, dass 4 Threads das Bild zeichnen(jeder einen anderen Bereich), was allerdings eher unwahrscheinlich ist, denn mit kleineren Bildern geht es ja...
Muss man vielleicht noch irgendwo Speicher Allokieren(und nachher natürlich freigebe)? oder ist das ganz falsch?

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

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: TImage/Bitmap zu groß?

Beitrag von Scotty »

Das sind drei Fragen, die dir wahrscheinlich niemand beantworten kann. Auf jeden Fall kann ein Bitmap in deiner Größe unter Linux erzeugt und gespeichert werden. Vielleicht grenzt du das Problem weiter ein.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TImage/Bitmap zu groß?

Beitrag von m.fuchs »

Scotty hat geschrieben:Das sind drei Fragen, die dir wahrscheinlich niemand beantworten kann. Auf jeden Fall kann ein Bitmap in deiner Größe unter Linux erzeugt und gespeichert werden. Vielleicht grenzt du das Problem weiter ein.

Unter Windows aber möglicherweise nicht, zumindest nicht als 32-Bit-Programm. Wenn ich nur ein Image mit 15000x15000 Pixeln erzeuge, liegt der RAM-Verbrauch bei fröhlichen 1,3 GiB. Lasse ich es dann noch speichern ist Schluss mit einem Out-of-Memory. 32-Bit-Prozesse dürfen unter Windows nur 2 GiB RAM verbrauchen, vermutlich ist da die Grenze erreicht.

Scotty hat geschrieben:Ich dachte an eben diesen Unterschied (wobei die Hypothese bei 650MB kaum eine Überlegung wert ist). Deshalb habe beide Varianten ausprobiert (wie geschrieben).

Ja, aber unter Linux. Wie ist dort die maximaler Speichergröße für einen Prozess?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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: TImage/Bitmap zu groß?

Beitrag von Scotty »

Stimmt, auch unter Linux wird 2x 650MB Speicher alloziert. Dann kommt man schnell zum 2GB-Limit (oder weniger) [1]. Linux kann dank eingebauter PAE bis zu 64GB auf 32bit OSen benutzen [2]. Interessantes Thema :-)

[1] http://msdn.microsoft.com/en-us/library ... 85%29.aspx
[2] http://en.wikipedia.org/wiki/Physical_A ... sion#Linux

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: TImage/Bitmap zu groß?

Beitrag von theo »

@Komoluna: Kannst du mal erklären wozu du das brauchst? Vielleicht findet sich ja eine andere Lösung.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: TImage/Bitmap zu groß?

Beitrag von Komoluna »

Mein Programm soll mit einer alternativen Methode Fraktale rendern( http://de.wikipedia.org/wiki/Sierpinski ... haos-Spiel ) alles funktioniert perfekt, aber ab einer bestimmten Größe ist kein lesezugriff auf das bitmap mehr möglich( zumindest von außen, denn wenn das Bitmap sich als TImage.Picture.Bitmap wiederfindet, dann wird es angezeigt(lesezugriff möglich)...
weiß jemand ob dass ein bug im Compiler, debugger oder was weiß ich ist, oder gibt es dafür einen bestimmten Grund?

MFG
Komoluna

P.S.: Ich hasse smartphonetastaturen(die sinf so klein)
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: TImage/Bitmap zu groß?

Beitrag von theo »

Ich weiss nicht genau was du brauchst, aber vielleicht kann dir OpBitmap helfen, wenn es nur um das erzeugen und speichern geht.
Da kannst du dir sicher sein, dass es nur den Speicher nimmt, den es benötigt.
Also wenn du mit 16 Farben auskommst, dann benötigt es ein halbes Byte pro Pixel.

Hier ein Beispiel

Code: Alles auswählen

...
uses opbitmap, opbitmapformats;
...
procedure TForm1.Button1Click(Sender: TObject);
var opb:TOPPicture;
begin
  opb:=TOPPicture.Create;
  opb.Bitmap.PixelFormat:=pf4bit;
  opb.Bitmap.CopyFromColorTable(StdColors);
  opb.Bitmap.Width:=15000;
  opb.Bitmap.Height:=15000;
  opb.Bitmap.Canvas.Brush.Color:=clWhite;
  opb.Bitmap.Canvas.FillRect(Rect(0,0,15000,15000));
  opb.Bitmap.Canvas.Pen.Color:=clRed;
  opb.Bitmap.Canvas.MoveTo(0,0);
  opb.Bitmap.Canvas.LineTo(5000,5000);
  opb.Bitmap.Canvas.Pen.Color:=clGreen;
  opb.Bitmap.Canvas.LineTo(10000,10000);
  opb.SaveToFile('big.bmp');
  opb.free;
end;     

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: TImage/Bitmap zu groß?

Beitrag von Komoluna »

Danke für den tipp, werde ich mal ausprobieren...
Allerdings habe ich momentan wenig Zeit, weshalb ich erst morgen(9.9.2013)
das Problem weiterbearbeiten kann...
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Antworten