Laden...

Große Bilder (5000 x 5000 Pixel) darstellen

Erstellt von mcpd vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.623 Views
M
mcpd Themenstarter:in
174 Beiträge seit 2009
vor 15 Jahren
Große Bilder (5000 x 5000 Pixel) darstellen

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.

479 Beiträge seit 2008
vor 15 Jahren

Hallo,

wie wärs mit runterskalieren?

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
72 Beiträge seit 2008
vor 15 Jahren

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?

M
mcpd Themenstarter:in
174 Beiträge seit 2009
vor 15 Jahren

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?

Gelöschter Account
vor 15 Jahren

Die Exception erhalte ich schon während der Code compiliert wird.

dann liegt es nciht am bild. das hat dann mit etwas komplett anderem zu tun, da der compiler keine bilder lädt.

L
36 Beiträge seit 2006
vor 15 Jahren

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?

M
mcpd Themenstarter:in
174 Beiträge seit 2009
vor 15 Jahren

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.

Gelöschter Account
vor 15 Jahren

Wenn ich zum Test die Taste F5 oder F6 drücke, bekomme ich diese Fehlermeldung.

das ist unzureichend erläutert. bekommst du es nun beim compilieren selbst oder wenn das programm versucht zu starten?

L
36 Beiträge seit 2006
vor 15 Jahren

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.

3.971 Beiträge seit 2006
vor 15 Jahren

ü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...

5.657 Beiträge seit 2006
vor 15 Jahren

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

L
36 Beiträge seit 2006
vor 15 Jahren

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.