Zu wenig Arbeitsspeicher in image klasse

frögli

Grünschnabel
Salü alle zusammen

Habe folgende CodeZeilen:

Dim imageStream As MemoryStream = New MemoryStream(image)
Dim sourceImage As Bitmap = CType (Bitmap.FromStream (imageStream), Bitmap)

Die zweite davon produziert die Fehlermeldung zu wenig Arbeitsspeicher. Das Bild welches daher kommt, hat eine Grösse von 4MB.
Was muss ich machen um diesen Fehler zu umgehen? Ein 4MB Bild kann doch nicht den Arbeitsspeicher sprengen, oder doch?


Vielen lieben Dank für Hinweise
 

Shakie

Erfahrenes Mitglied
Du kannst das Bitmap auch direkt aus einem Image erstellen, ohne MemoryStream:
Code:
Dim sourceImage As Bitmap = New Bitmap(image)
Vielleicht funktioniert das besser.

EDIT: Ich finde die FromStream-Methode in der MSDN gar nicht. Ist Bitmap bei dir ein System.Drawing.Bitmap?
 
Zuletzt bearbeitet:

Norbert Eder

Erfahrenes Mitglied
  1. Verwendest du ein Format, welches unterstützt wird?
  2. Ist dein Image komprimiert? Wenn ja, dann kann es schnell mal sein, dass die wahre Imagegröße bei 80 MB+ liegt
  3. Musst du einen MemoryStream verwenden? Wäre Bitmap.FromFile nicht ausreichend?
 

frögli

Grünschnabel
Salü Norbert, salü Shakie und salü Masterdavat

Vielen Dank für Eure Beiträge. In der zwischenzeit habe ich den Code im Projekt soweit reduziert, dass ich nur noch drei Zeilen habe, welche das Problem illustrieren.

Den Stream verwende ich, weil das Bild am Schluss aus einer Datenbank kommt. Der folgende Code ist auf D:\ programmiert, weil mir das am schnellsten gelaufen ist. Klar, in real geht das nicht.

Thearsheim ist 4MB gross. Andere Bilder, die viel grösser sind, funktionieren.
Hat jemand eine Idee, was das sein könnte, dieser MemoryOverflow bei Bild = New Bitmap(sr.BaseStream)?

Das gleiche Problem bekomme ich auch wenn ich Dim Bild2 = new Bitmap("D:\testimage/THIERSHEIM.jpg") programmiere.
Somit lässt sich das Problem in einem Einzeiler darstellen.

Vielen lieben Dank für jegliche Hinweise.



Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim bildPfad As String
Dim vBildName As String
Dim sr As StreamReader
Dim Bild1 As Bitmap
Dim Bild2 As Bitmap
Dim rGuid As Guid

'Für Bild 1
bildPfad = "D:/testimage/B_Hofmann_Natursteinhandel.JPG"
Bild2 = New Bitmap(bildPfad)

sr = New StreamReader(bildPfad) '<-- Zeile geht
Bild1 = New Bitmap(sr.BaseStream)

rGuid = Guid.NewGuid()
vBildName = "D:/testimage/TestBild_" + rGuid.ToString() + ".jpg"
Bild1.Save(vBildName)

Image1.ImageUrl = vBildName(1)

'Für Bild 2
bildPfad = "D:/testimage/THIERSHEIM.jpg"
Bild2 = New Bitmap(bildPfad)

sr = New StreamReader(bildPfad)
Bild1 = New Bitmap(sr.BaseStream) '<-- Hier MemoryOverflow

rGuid = Guid.NewGuid()
vBildName = "D:/testimage/TestBild_" + rGuid.ToString() + ".jpg"
Bild1.Save(vBildName)

Image2.ImageUrl = vBildName(2)

End Sub
 

Shakie

Erfahrenes Mitglied
Der Fehler tritt also bei einer bestimmten Datei auf und nicht bei allen Dateien, die eine bestimmte Dateigröße überschreiten? Vielleicht ist die Datei kaputt.
 

frögli

Grünschnabel
Salü Shakie, der Fehler tritt bei einigen Dateien welche so ab etwa 4 MB sind auf. Ich habe mehrere davon. Aber ich habe auch ein Bild mit 6MB das funktioniert.

Es scheint mir, dass die Zeile Bild1 = New Bitmap(sr.BaseStream) das Bild entpackt und somit über 200MB Ram gebraucht werden. Und je nach Bild und komprimierungsrate ist das halt mehr oder weniger.

Nun suche ich eine Lösung um das Bild ohne zu entkomprimieren an die Bitmap klasse zu übergeben. Gibt es eventuell sowas?

Viele Grüsse
 

Neue Beiträge