Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Große Bilder (5000 x 5000 Pixel) darstellen
mcpd
myCSharp.de - Member



Dabei seit:
Beiträge: 174

Themenstarter:

Große Bilder (5000 x 5000 Pixel) darstellen

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
markus111
myCSharp.de - Member

Avatar #avatar-3108.png


Dabei seit:
Beiträge: 479
Herkunft: Henstedt-Ulzburg

beantworten | zitieren | melden

Hallo,

wie wärs mit runterskalieren?

mfg.
markus111
private Nachricht | Beiträge des Benutzers
LuckyGeorge
myCSharp.de - Member

Avatar #avatar-3262.jpg


Dabei seit:
Beiträge: 72

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
mcpd
myCSharp.de - Member



Dabei seit:
Beiträge: 174

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

Zitat
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.
Luth
myCSharp.de - Member



Dabei seit:
Beiträge: 36

beantworten | zitieren | melden

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.
Zitat
... 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?
private Nachricht | Beiträge des Benutzers
mcpd
myCSharp.de - Member



Dabei seit:
Beiträge: 174

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

Zitat
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?
Luth
myCSharp.de - Member



Dabei seit:
Beiträge: 36

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
kleines_eichhoernchen
myCSharp.de - Member

Avatar #avatar-2079.jpg


Dabei seit:
Beiträge: 3.971
Herkunft: Ursprünglich Vogtland, jetzt Much

beantworten | zitieren | melden

Zitat
ü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...
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.655
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Luth
myCSharp.de - Member



Dabei seit:
Beiträge: 36

beantworten | zitieren | melden

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
Zitat
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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Luth am .
private Nachricht | Beiträge des Benutzers