Hallo! Ich bin hier neu im Forum und hoffe, dass Ihr mir helfen könnt. Folgendes Problem: Ich möchte eine Karte in einer Größe von 5000 x 5000 Pixel in einer PictureBox darstellen und bekomme beim Laden des Images eine Exception: "Out Of Memory". Gibt es in C# eine Möglichkeit Bilder in diesem Format und größer darzustellen?
Danke.
Hallo,
wie wärs mit runterskalieren?
mfg.
markus111
Hmm, ich arbeite hier mit Bildern von 8000x8000 Pixel (16Bit Tiefe) - eine OutOfMemoryException krieg ich erst ab dem 10. Bild (bei 2 GByte Ram) - kann es sein, daß deine laufenden Applikationen zuviel Speicher fressen oder du den Speicher an anderer Steller verbrätst?
Danke für die schnelle Info. Mein PC besitzt 4 GByte RAM und außer MS VS 2008 läuft keine andere Applikation. Die Exception erhalte ich schon während der Code compiliert wird. Ist das denn generell ein physisches Speicherproblem des PC's oder gibt es eine Grenze in C# für das Laden von Bildern?
Eine Grenze gibt es, die ist aber RAM abhängig und liegt höher als die 5000x5000. Bei mir schafft er es ganz gut bis 24.000x24.000, bei 40.000x24.000 stürzt er allerdings ab weil der RAM nicht reicht. Und mach dich auf ewige Zeiten zum Neuzeichnen gefasst.
... bekomme beim Laden des Images eine Exception: "Out Of Memory"./QUOTE]
Beim Laden oder beim Compilieren? Wann und wie lädst du denn das Bild? Was ist die Fehlermeldung?
Die Exception erhalte ich schon in der Entwurfsphase. Ich habe ein Formular, platziere eine PictureBox und über die Eigenschaft Image lade ich das Bild. Wenn ich zum Test die Taste F5 oder F6 drücke, bekomme ich diese Fehlermeldung.
Du könntest ja einfach mal versuchen das Bild nicht im Formdesigner zu laden und zu platzieren, sondern derst zur Laufzeit einzulesen und der Picturebox zu übergeben. Ich kann mir vorstellen das der Designer da bei bestimmten Bildgrößen eher rumspinnt als die Bitmap-Klasse selbst.
Bitmap bmp = new Bitmap(FileName);
pictureBox.Image = bmp;
Das funktioniert bei mir problemlos bis mindestens 8000x6000 Bilder.
über die Eigenschaft Image lade ich das Bild
Mach sowas bei großen Bildern erst im form_load, oder einem anderem Event zur Laufzeit.
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
Hier gibs ein paar allgemeine Infos zum Arbeiten mit großen Bitmaps, und warum es mal geht und mal nicht: Performance- und andere Fragen zu XXL-Bitmaps (bes. der letzte Beitrag). Der Speicherbereich muß nämlich am Stück frei sein und darf nicht fragmentiert sind, sonst gibs die Exception. Das wird wohl in der Entwicklungsumgebung der Fall sein. Viele Möglichkeiten bleiben die allerdings nicht, abgesehen davon, kleinere Bitmaps zu verwenden.
Christian
Weeks of programming can save you hours of planning
Das klingt unheimlich plausibel, aber ... wenn ich mit untenstehendem Code mein Bitmap (21600x10800) zusammenbastel, benötigt das Bitmap alleine, ohne die Rohdaten etwa 940 MB Ram. Die reserviere ich ja direkt am Anfang. Das ist, im Debug und Release-Mode, bestimmte einige Dutzend mal gelaufen ohne je eine Exception zu werfen.
public Bitmap RawTobitmap()
{
Bitmap bmp = new Bitmap(rawdata.GetLength(0), rawdata.GetLength(1));
BitmapData bmData = bmp.LockBits(new Rectangle(0,0,bmp.Width, bmp.Height),ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
IntPtr ptr = bmData.Scan0;
{ ...Farbwerte setzen, Bitmap zusammenbauen .... }
bmp.UnlockBits(bmData);
return bmp;
}
Edit: Gerade gefunden und Hier auch
Your program has a virtual memory space that is about 2 Gigabytes but it is fragmented by sections of code and data. You can typically get about 500 Megabytes of contiguous memory but beyond that you'll quickly lose. Your image is right there with about 510 MB. As John pointed out, you'll need a 64-bit operating system.
Es scheint so als ob ich nur Glück hatte weil Vista 64 für einen Nutzerprozess einfach mehr zusammenhängenden (virtuellen) Speicher adressieren kann. Da könnte das Problem von mcpd sein, das er ein 32Bit System laufen hat.