Große Bilder in PictureBox anzeigen

mcpd

Grünschnabel
Hallo! Habe ein Problem mit der Darstellung großer Bilder in der PictureBox. Bei einer Größe von 5000 x 5000 Pixel und größer bekomme ich eine Exception: "Out Of Memory". Wie gelingt es mir in einer PictureBox Bilder derartiger Größe darzustellen?
Danke für Eure Hilfe.
 
Tritt das Problem erst bei der Anzeige auf oder auch schon beim Laden der Bilder?
Ansonsten wäre meine Idee das Bild ev. zu Splitten, falls die größe bei behalten werden soll.
Ev. über das Paint Ereignis mit der Methode DrawImage des Graphics Objektes.
 
Tritt das Problem erst bei der Anzeige auf oder auch schon beim Laden der Bilder?
Ansonsten wäre meine Idee das Bild ev. zu Splitten, falls die größe bei behalten werden soll.
Ev. über das Paint Ereignis mit der Methode DrawImage des Graphics Objektes.

Die Exception wird während des Compilieren ausgelöst. Die Grösse der Karte muss beibehalten werden, da auf dieser Karte Touren gezeichnet werden. Die Karte zu kacheln wäre eine Lösung, aber wenn ich aus einer Karte mehrere Kacheln erstellen muss (ca. 100 Stück) wäre ein Einzeichnen einer Tour bzw. Route für den Anwender nicht intuitiv. Macht mir das .NET Framework einen Strich durch die Rechnug? Sind dort die Grenzen gesetzt?
 
WIe während des Compilierens :confused:
Am besten du setzt mal direkt die Quellcode Zeile hier rein bei der die Exception auftritt.

Und auch beim Kacheln könnte man es dem User so anzeigen lassen also würde er eine Große Karte bearbeiten.
Änhlich wie map24 oder google maps stell ich mir das vor.
 
WIe während des Compilierens :confused:
Am besten du setzt mal direkt die Quellcode Zeile hier rein bei der die Exception auftritt.

Und auch beim Kacheln könnte man es dem User so anzeigen lassen also würde er eine Große Karte bearbeiten.
Änhlich wie map24 oder google maps stell ich mir das vor.

Es gibt dazu keinen Quellcode. Denn ich platziere auf ein Formular eine PictureBox und über die Eigenschaft "Image" lade ich die Karte. In der Entwurfsansicht ist die Karte zu sehen. Nach dem ich F5 bzw F6 drücke erhalte ich die Exception.

Wie könnte man diese Funktionalität in C# implementieren (ähnlich map24)?
 
Zu aller erst.
Versuch mal das Bild zur Laufzeit in die PictureBox zu laden.
Ich glaube diese hat extra eine Load Funktion, falls doch nicht einfach so aufrufen
Code:
pictureBox.Image=new Bitmap(@"C:\meinTest.jpg");

Zum Splitten
Ich würde das BIld mit einem Bildbearbeitungsprogramm "zerschneiden".
Und mir zum Beispiel in einer Xml Datei merken welches Bild an welches gehört.

Für die Picturebox würde ich als Container/Parent ev. ein Panel verwenden und die Eigenschaft AutoScroll des Panels auf true setzen.

Die PictureBox mit der Location 0;0 setzen und als Size dein 5000;5000.

Über das Paint Ereignis der PictureBox würde ich jetzt mittel der Eigenschaft VisibleRectangle des Graphics Objektes mir den sichtbaren Bereich liefern lassen.

Dann in der Xml nach schauen welche Bilder in diese Region reinpassen und per DrawImage darstellen lassen.

Und ev. beim Scroll Ereignis des Panel pictureBox.Invalidate aufrufen damit auch wirklich neu gezeichnet wird.

puh hoffe is verständlich wie ichs mein. :D

Ich persönlich würde erstmal die Splittung bevorzugen da dort der Arbeitsspeicher weniger ausgelastet sein müsste.
Ansonsten Performance mäßig müsste man das ganze einfach testen.
 
Vielen Dank für Deine Tipps! Ich werde das mal checken und melde mich bei Erfolg oder Nichterfolg zurück.
 
Hallo,

wenn ich das richtig sehe, versuchst Du ein ca 750 MB großes Bild zu laden. Kann es sein, dass Dein Arbeitsspeicher das gar nicht hergibt?

Viele Grüße
flowpow
 

Neue Beiträge

Zurück