2009-06-30 4 views
0

Wenn ich versuche, die Quelle von WPF-Image auf eine Image-Datei, die ~ 11MB Größe und Shot in 14 MeagaPixcel-Kamera ist, schießt der Speicher bis zu ca. 170 MB, wenn das Bild auf dem Bildschirm gerendert wird und der Speicher auch nach dem Rendern nicht herunterkommt. Wenn ich versuche, dasselbe mit .Net 2.0 Picturebox-Steuerelement zu tun, ist der verwendete Speicher nur 0,5 MB bis 1 MB. Logischerweise, wenn die Dateigröße eines Bildes 11MB ist, sollte es maximal 11MB belegen, während das Rendern richtig ist? Was ist die Ursache für ein solches Verhalten in WPF? Und gibt es eine Möglichkeit, den zusätzlichen Speichermüll zu entsorgen, nachdem das Rendering auf dem Bildschirm durchgeführt wurde?Image-Datei, die ~ 11MB Größe ist, nimmt viel Speicher beim Rendern mit WPF Image-Steuerelement

+1

Je nach dem ursprünglichen Format der Datei dekomprimiert es möglicherweise die Datei im Speicher und die "volle" Größe ist viel größer. –

Antwort

2

Um den ersten Teil Ihrer Frage zu beantworten:

Bilder auf Digitalkameras geschossen werden als jpg-Dateien gespeichert und somit komprimiert. Beim Lesen in den Speicher wird es unkomprimiert. Dies erklärt den Unterschied in der Größe, die Sie hier sehen.

Zum Beispiel hat ein Foto auf einer Canon EOS 450 eine Dateigröße auf der Festplatte von 3 MB. Es ist Abmessungen 3072 x 2048. Dies führt zu einer Größe im Speicher von 3072 * 2048 Pixel * 24 Bit/Pixel = 18.874.368 Bytes (macht den Sinn - ich bin nie 100% sicher, dass diese Berechnungen)

Die Speicherauslastung wird nicht verringert, bis das Objekt, das die Bilddaten enthält, außerhalb des Gültigkeitsbereichs liegt und von der Speicherbereinigung gelöscht wird.

Zum Beispiel werden Sie etwas entlang der Linien dieses Codes müssen:

using (Image image = Image.FromFile(imageName)) 
{ 
    // Non property item properties 
    FileName = imageName; 
    PixelFormat = image.PixelFormat; 
    Width = image.Size.Width; 
    Height = image.Size.Height; 

    foreach (PropertyItem pi in image.PropertyItems) 
    { 
     EXIFPropertyItem exifpi = new EXIFPropertyItem(pi); 
     this.propertyItems.Add(exifpi); 
    } 
} 

Nachdem ich alle Informationen, die ich aus dem Bild benötigen haben die using Anweisung ermöglicht die Garbage Collection in und frei treten die Erinnerung.

+0

Das ist eine wichtige Sache zu realisieren. Einmal gelesen von Disc und in ein Bildobjekt (GDI +, normales .NET oder WPF), das Bild ist im Grunde ein Bitmap anstelle von jpg/png/gif – colithium

+0

Dank ChrisF Ihre Antwort macht Sinn danke, aber mein Zweifel ist verwandt zu dem in WPF verwendeten Rendering-Mechanismus. Beim Erstellen eines Bildes mit einer beliebigen BitmapSource bleibt die Momory konstant, aber nur wenn das Bild auf dem Bildschirm gerendert wird, belegt es den gesamten Speicher entsprechend der Größe des Bildes. Wenn ich das mit dem Picturebox-Steuerelement von .Net 2.0 verglichen und den SizeMode des Picturebox-Steuerelements auf SizeMode.Zoom gesetzt habe, kann ich sehen, dass es keinen Speicher verbraucht oder welcher Speicher auch immer verbraucht wird, selbst wenn die Picturebox es hat das Bild wird darauf gerendert. –

+0

Wird beim Rendern eine andere Kopie erstellt, während das PictureBox-Steuerelement die Daten direkt verwendet? Ich weiß es nicht - ich stelle es nur als eine Art von Untersuchung vor. – ChrisF