Re: Bildanzeige von sehr grossen Bildern

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance



Hallo Gerold,

danke für deinen Tipp. Werde es wahrscheinlich mals so probieren. In
IrfanView geht das Bild dagegen verhältnismäßig schnell auf, ist aber
kein managed Code wie in net.

Frank


On Thu, 13 Jul 2006 18:48:24 +0200, Gerold Mittelstädt
<1358[remove-this]@gmx-topmail.de> wrote:

Frank Müller schrieb:
Hallo,

bei der Anzeige von Bildern mit einer Größe von 32 MB in einer

Wie viele tausend Pixel sind die denn groß? Und welches Format?

PictureBox erhalte ich eine Win32Exception. Anschließend erscheint
folgende Meldung:

BufferedGraphicsContext kann nicht entfernt werden, da momentan ein
Puffervorgang läuft.

Zu viele Daten im Speicher, die dann auch noch skaliert werden sollen..
Früher oder später gibt da jedes System auf.

Mein Aufruf der Bilddatei:

' Großes Bild laden
Dim myImage As Image = Image.FromFile(path)

' PictureBox-Zeichnungsbereich an Größe des Bildes anpassen
DokumentPictureBox.ClientSize = New Size(CInt(myImage.Width *
picScalFactor), CInt(myImage.Height * picScalFactor))

' Bild der PictureBox zuweisen
DokumentPictureBox.Image = myImage


DokumentPictureBox.Visible = True

Warum erhalten ich eine Win32-Exception, bzw. gibt es effektivere
Methoden große Bilder zu laden?

Wie gesagt.. Mit einem 32MB-Bild dürften die Meisten Systeme überfordert
sein.
Mal ganz davon abgesehn, das das Bild wahrscheinlich in Originalgröße
sowieso nicht komplett auf den Bildschrim passt (picScalFactor)

Du könntest das Bild z.B. vorab auf die Größe der PictureBox verkleinern und
somit die Datengröße reduzieren. Quasi ein "Thumbnail" ;) erstellen, dass
dann nurnoch ein Bruchteil der ursprünglichen Datengröße groß ist.

Die neue Größe kann man z.B. damit berechnen:

width: neue Breite
height: neue Höhe
max: width und height sind Maximalwerte und dürfen nicht überschritten
werden

Public Shared Function GetNewSize(ByVal graphic As System.Drawing.Image,
_
ByVal width As Integer, _
ByVal height As Integer, _
ByVal max As Boolean) As Size
Dim NewWidth, NewHeight As Integer
If graphic.Width > graphic.Height Then
NewWidth = width
NewHeight = width * graphic.Height \ graphic.Width
If max Then
If NewHeight > height Then
NewHeight = height
NewWidth = height * graphic.Width \ graphic.Height
End If
End If
Else
NewHeight = height
NewWidth = height * graphic.Width \ graphic.Height
If max Then
If NewWidth > width Then
NewWidth = width
NewHeight = width * graphic.Height \ graphic.Width
End If
End If
End If
Return New Size(NewWidth, NewHeight)
End Function


Damit ist die Denkarbeit erledigt. Als Breite und Höhe übergibst du den
Anzeigebereich der PictureBox, erstellst aus dem riesigen Bild ein neues mit
den neuen Maßen und weist dieses dann der PictureBox als Quelle zu.


Gerold
.



Relevant Pages