2009-06-30 6 views
0

WPF画像のソースを〜11MBのサイズの画像ファイルに設定しようとすると、14 MeagaPixcel Cameraで撮影され、イメージがレンダリングされた後にメモリが決して降下することはありません。 .Net 2.0 Pictureboxコントロールを使って同じことをしようとすると、使用メモリは0.5MBから1MBしかありません。 論理的には、イメージのファイルサイズが11MBの場合、レンダリング中に最大で11MBしか占有しませんか? WPFでこのような動作の原因は何ですか?レンダリングが画面上で実行された後、余分なメモリの迷惑を処分する方法はありますか?WPFを使用してレンダリングすると〜11MBのサイズの画像ファイルがレンダリングされる画像コントロール

+1

ファイルの元のフォーマットに応じて、メモリ内のファイルを解凍している可能性があり、そのフルサイズははるかに大きいです。 –

答えて

2

あなたの質問の最初の部分に答えるために:デジタルカメラで撮影し

画像がJPGファイルとして保存され、したがって、圧縮されています。メモリに読み込まれると、解凍されます。これはあなたがここで見ているサイズの違いを説明します。

たとえば、Canon EOS 450で撮影した写真のファイルサイズは3 MBです。これは、寸法がX 2048これは3072個の* 2048画素* 24ビット/ピクセル= 18874368バイトのメモリ内サイズにつながる3072(そのメイクセンスを行います - 私は決してこれらの計算の100%確信していない)をしているのです

メモリ使用量は、画像データを保持しているオブジェクトが範囲外になり、ガベージコレクションによってクリアされるまで下がりません。私はusing文がガベージコレクションが中やフリーキックを可能にする画像から、私は必要なすべての情報を持ってたら

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); 
    } 
} 

:あなたはこのコードの線に沿って何かをする必要があります。例えば

想い出。

+0

これは実現するために重要なことです。ディスクから読み込んで画像オブジェクト(GDI +、通常の.NET、WPF)に入れたら、画像は基本的にjpg/png/gifの代わりにビットマップになります – colithium

+0

ありがとうChrisF あなたの答えは感謝しますが、 WPFで使用されているレンダリングメカニズムに適用されます。 BitmapSourceのいずれかを使用してイメージを作成している間は、モーメントは一定のままですが、イメージがスクリーン上にレンダリングされるときにのみ、イメージのサイズに従ってすべてのメモリを占有します。 これを.Net 2.0のPictureboxコントロールと比較して、PictureboxコントロールのSizeModeをSizeMode.Zoomに設定すると、ピクチャボックスがあってもメモリが使い果たされず、使用されたメモリがすぐに破棄されることがわかりますイメージがレンダリングされます。 –

+0

PictureBoxコントロールがデータを直接使用している間に、レンダリングで別のコピーが作成されますか?私は知らない - ちょうどそれを照会の行として提案する。 – ChrisF