VB.NET PictureBox benötigt zu viel Arbeitsspeicher

Terminator2

Erfahrenes Mitglied
Hallo,

In meinem Programm habe ich in einem Graphics Objekt gezeichnet und dieses anschließend als Datei gespeichert (uA. um Speicherplatz zu sparen). Die Bilder haben eine Auflösung von 2800x3400 Pixeln. Als JPEG gespeichert beträgt der Platzverbrauch jedoch lediglich 272kB. In meinem Formular wird das aktuelle Bild in einer PictureBox angezeigt. In einem Array wird eine History der Bilder mit Dateipfad angelegt. Alle Bilder werden in einem weiteren Formular in je einer Picturebox angezeigt.
Mein Programm nimmt jedoch viel zu viel Arbeitsspeicher in Anspruch:
0 Bilder: 13,7MB
1 Bild: 99MB (2 Pictureboxen)
2 Bilder: 212MB (3 Pictureboxen)

Die History funktioniert wie folgt:
Code:
Public PB() As PictureBox
Public Sub ShowImages()
            Dim i As Integer

            Try
                For i = 0 To PB.Length - 1
                    PB(i).Hide()
                    PB(i).Dispose()
                Next
            Catch ex As Exception

            End Try

            Array.Resize(PB, 0)

            For i = 0 To MdlImages.ListIMG.Bild.Count - 1
                Try
                        Array.Resize(PB, PB.Length + 1)
                Catch ex As Exception
                    Array.Resize(PB, 1)
                End Try

                PB(PB.Length - 1) = New PictureBox
                With PB(PB.Length - 1)
                    .Parent = FlowLayoutPanel1
                    .Width = FlowLayoutPanel1.Width - 25
                    .Height = .Width / 4 * 3
                    .SizeMode = PictureBoxSizeMode.Zoom
                    .Image = Image.FromFile(MdlImages.ListIMG.Bild.Item(i).BildPfad)
                    .BorderStyle = BorderStyle.FixedSingle
                    AddHandler .DoubleClick, AddressOf PB_DblClick
                    Me.FlowLayoutPanel1.Controls.Add(PB(PB.Length - 1))
                End With
            Next
    End Sub

Die Bilder könnten beim Anzeigen in der History auch verkleinert werden, falls das was bringt.

Vielen Dank im vorraus!
 
Hallo,

JPEG-Dateien enthalten komprimierte Bilder und benötigen daher wenig Speicherplatz. Wenn du jedoch damit arbeiten willst (anzeigen) müssen sie wieder dekomprimiert werden und verwenden dann sehr viel mehr Speicher.

Die Bilder könnten beim Anzeigen in der History auch verkleinert werden, falls das was bringt.
Das bringt auf jeden Fall was.

Gruß
MCoder
 
Hallo,

Also das JPEG eine Komprimierung ist, ist ja logisch.
In der History werden die Bilder nicht mehr verändert. Sie werden einmalig gezeichnet (im Hauptfenster) abgespeichert und von der Datei in die History geladen. Ab dem Zeitpunkt bleiben sie unverändert. Ist es nicht möglich, JPEG Bilder mit weniger Speicherplatzaufwand anzuzeigen? Die Bildvorschau von Windows braucht schließlich auch keine 100MB für ein einziges Bild...


Gruß David
 
Richtig, der Explorer braucht nur ca. 90 MB für ein 3456x2304 und einer Bildgröße von nicht ganz 3 MB (jpg wohlgemerkt). So gesehen bist du nicht so schlecht unterwegs, wobei deine BIlder ja auch größer sind als die meinigen. :)

Es stellt sich halt die Frage, ob deine Bilder auch tatsächlich so groß sein müssen. Ich denke nicht, dass diese in der Größe angezeigt werden. D.h. da kann man schon vorher mal was machen.

Was die History betrifft würde ich definitiv nur mehr Thumbnails verwenden.
 
Erstaunlich... hätte nie gedacht dass selbst die Programme so viel brauchen. Die Windows Fax und Müllanzeige braucht rund 45MB, das kommt hin.
Dann ist die Frage, wie ich es verhindern kann, dass der Speicher immer voller wird, obwohl nicht mehr Bilder angezeigt werden. Ich setzte das Image der PictureBox und setze es später erneut. Dann kommt der gleiche Speicher nochmals hinzu... Wie kann ich das alte Bild rauswerfen?


Gruß David
 
Mach auf das Image ein Dispose und nicht auf die PictureBox. Und du hast einen Eventhandler auf die jeweiligen Pictureboxen, die solltest du auch entfernen, bevor du die PictureBox disposed.
 
Das war schon sehr gut.
Ich habe nun folgendes beobachtet:
Programmstart: 13MB

1 Bild geöffnet (1x PB mit Image 389x471 + 1x PB mit Image 269x326Pixeln)
=>100MB
Den TaskManager einfach mal über alle PictureBoxen schieben => 62,5MB

2 Bilder geöffnet (1x PB mit Image 389x471 + 2x PB mit Image 269x326Pixeln)
=> 112MB
Anschließend direkt nur noch 63MB

3 Bilder geöffnet (1x PB mit Image 389x471 + 3x PB mit Image 269x326Pixeln)
=> 176MB
Den TaskManager einfach mal über alle PictureBoxen schieben => 63,5MB

4 Bilder geöffnet (1x PB mit Image 389x471 + 4x PB mit Image 269x326Pixeln)
=> 213MB
Den TaskManager einfach mal über alle PictureBoxen schieben => 64MB


Was löst der TaskManager also aus, was den Speicher so drastisch reduziert? Habe bereits versucht nach jedem Hinzufügen jede PictureBox mit Invalidate neu zeichnen zu lassen, vermutlich ohne Erfolg.


Gruß David
 
Habe das Problem nun behoben.
Ich habe die Bilder ja jedes mal von der Festplatte geladen, um Arbeitsspeicher zu sparen. Jedoch braucht man weniger Speicher, wenn man die Bilder in einer Liste im Arbeitsspeicher speichert. Nun benötigt jedes weitere Bilder in einer Auflösung von bis zu 640x640 maximal 2800kB.
 
Zurück