Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Bitmap Größe...
Aya - Mi 30.10.02 19:44
Titel: Bitmap Größe...
Hi,
kann es sein das die größe eines TBitmaps unter Win9x begrenzt ist?!
ich wollte ein TBitmap mit der größe 3508x2480 erstellen, und bekomme jedesmal die meldung "Invalid Parameter"
unter WinNT/2k funktioniert es wunderbar...
Sollte es so sein das es unter Win9x nicht geht... wie groß darf es da maximal sein, oder kann ich es irgendwie umgehen??? (evtl etwas anderes als TBitmap nutzen??)
Au'revoir,
Aya
Anonymous - Mi 30.10.02 23:08
Ich bekomme OutOfResorces ... Der Parameter stimmt nicht . Also hab ich zum Testen die Farbtiefe reduziert und hatte dann keine Probleme.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var Bmp: TBitmap; begin Bmp := TBitmap.Create; try Bmp.PixelFormat := pf1bit; //<<<<< WICHTIG Bmp.Width := 3508; Bmp.Height := 2480; Canvas.Draw(0, 0, Bmp); finally Bmp.Free end; end; |
TrueColor von der Größe verbraucht viel Speicher.
Aya - Mi 30.10.02 23:10
ja, schon... aber nen Druck mit 1Bit Farben is nich so die wucht *ggg*
Das ganze ist ja für einen ausdruck gedacht... ich zeichne etwas auf das Bitmap und kopiere es am ende einmal auf das Printer.Canvas.
Der grund warum ich nicht gleich auf das Canvas vom Printer zeichne ist weil es immer das komplette blatt ausfüllen soll, also ich stretche das Bitmap am ende auf die größe des Printer.PageWidth/Height :)
wenn es da eine bessere methode gibt, ich bin für alles offen... :)
Au'revoir,
Aya
PS: Sofern es geht.. wäre super wenn das bis morgen 17 Uhr geht *gg* Sonst krich ich probleme :)
Anonymous - Mi 30.10.02 23:29
Ich glaube nicht, daß die Größe ein Problem ist. Ich würde sagen, daß NT/2k besser mit dem Speicher umgehen können und es geshalb keine Probleme gibt. Das mit der 1Bit Farbtiefe sollte nur zeigen, daß nicht die Größe das Problem ist, sondern der Speicher.
Delete - Mi 30.10.02 23:42
Es liegt unteranderen an den GDI-Ressourcen. Windows98 kann da nicht so viele wie Windown2000. Bei 31xxx ist bei Windows98 schluß.
Anonymous - Mi 30.10.02 23:44
Ich hab auch Windows 98.
Delete - Mi 30.10.02 23:53
| Popov hat folgendes geschrieben: |
| Ich hab auch Windows 98. |
Schön. Ändert aber nichts an der Tatsache, dass Windows98 nurt eien betsimmte Anzahl an GDI-Ressourcen abkann.
Delete - Mo 01.11.04 22:45
Moin !
Ich dachte ich schreib hier mal weiter, weil ich genau das gleiche Problem habe.
Nur möchte ich nicht sofort drucken, ich habe einen Generator, der mir beliebig große Bilder (Pixel / dpi) erstellen kann. Nur bekomme ich sogar unter XP auch die "Falscher Parameter"-Meldung, weil die GDI-Res scheinbar schon ab einer Pixelgröße von 4096x4096 nicht reichen.
Gibt es ein anderes Bildobjekt, in das ich zeichnen kann, oder gibt es irgendeine Lösung, mit der ich ne Datei auf der Festplatte anlege und dann in diese das Bild schreibe? Ich kann ja in Delphi nur in das TBitmap-Objekt zeichnen, ohne es visuell zu machen (Mein generator benutzt ein TBitmap-Objekt als Attrib und nimmt die Canvas...)
Oder kann man sonst irgendwie den Speicher ausdehnen ? Ich wills zwar am Ende als Jpeg speichern, aber für nen BMP mit 4000x4000 px ist bei 16Bit ja schon recht groß ...
Hilfe & Thx für ersteres !
BenBE - Di 02.11.04 00:18
Ich würde das ganze in mehrere kleinere Bitmaps aufteilen. Das erhöht zwar den Speicher- und Verwaltungsaufwand, behebt aber einige Probleme mit StretchBlt und anderen API-Funktionen.
Lossy eX - Di 02.11.04 20:10
Ein TBitmap versucht sich standardmäßig als DDB (Device Depended Bitmap)(geräteabhängig) im Speicher abzulegen. Das ist ein Grafikkarten optimiertes Format welches auf 2D beschleunigten Karten einen ganz satten Geschwindigkeitsschub bringen kann. Je nach Aktion sogar bis zu Faktor 100. Es ist dafür aber an anderen Stellen ein wenig langsamer.
Folgender Code funktioniert unter XP nicht.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var Bmp: TBitmap; begin Bmp := TBitmap.Create; try Bmp.Width := 8192; Bmp.Height := 8192; finally Bmp.Free; end; end; |
Folgender Code funktioniert aber!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var Bmp: TBitmap; begin Bmp := TBitmap.Create; try Bmp.HandleType := bmDIB;
Bmp.Width := 8192; Bmp.Height := 8192; finally Bmp.Free; end; end; |
Mit der Eigenschaft HandleType kann man expliziet auf DIB (Device Independend Bitmap)(geräteunabhängig) umstellen. Dadurch benutzt man ein reines Speicherbitmap. Ein DIB schlägt sich auch direkt in den Speicher der Anwendung nieder wogegen man ein DDB nicht an einer Speicherveränderung fest machen kann. (Taskmanager)
@Popov: Durch das setzen eines Pixelformates (außer pfDevice) wird automatisch auf DIB umgestellt. Was auch den Effekt erklären würde warum es dann ging. Es müsste eigentlich auch mit 32Bit gehen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!