2016-10-12 12 views
-1

ファイルをビットマップにロードして、必要なイメージプロパティを取得してから、ビットマップを破棄する問題が発生しています。OutOfMemory例外ファイルからビットマップをロードする

foreach (string file in fiList) 
{ 
    newImage = new imageInfo(); 
    newImage.OrigName = currFile.Name; 
    newImage.Location = currFile.FullName; 
    newImage.NewName = cleanFileName(newImage); 
    newImage.ManualNameChange = false; 
    newImage.Type = type; 
    newImage.Size = Math.Round(sizeInMB, 2) + " KB"; 
    newImage.LastModified = currFile.LastWriteTime; 
    newImage.CreateDate = currFile.CreationTime; 
    tmpImage = Bitmap.FromFile(currFile.FullName); 
    newImage.DPI = 
     (int)Math.Ceiling(tmpImage.HorizontalResolution); 
    newImage.Width = tmpImage.Width; 
    newImage.Height = tmpImage.Height; 
    newImage.PixelFormat = tmpImage.PixelFormat.ToString(); 

    tmpImage.Dispose(); 

    ... 
} 

私はのOutOfMemoryエラーを取得しておくが、メモリプロファイラを実行している時に、appicationは、それが割り当てることのできる1.4ギガバイトの200Mを使用しています。私は画像を見て、このファイルは64MBのjpgなので、ビットマップに変換しても、残っている1.2GBの大部分を消費してはいけません。 Bitmap.FromFileでエラーが発生していますtmpImage

まだ多くのメモリが割り当てられていても、OutOfMemory例外が発生するのはなぜですか?

+3

私はあなたの問題を解決しましたが、イメージをディスク上の64MBにすることができますが、それはおそらくある程度圧縮されています。 .Netのメモリにロードされると、圧縮されなくなり、メモリの量は1ピクセルあたり_width * height *バイトになります。 –

+0

それは本当です。それが私の質問でこれを述べた理由です。 90%の圧縮率でさえ、これはかなり損失がありますが、残っているメモリの半分に過ぎません。 –

答えて

-1

掘り出しをした後、実際にはプログラムのメモリ割り当てとは関係ありません。この問題は、実際には破損したイメージをメモリにロードしようとしているためです。何らかの理由でイメージが壊れている場合、OutOfMemory Exceptionがスローされます。それは偽陽性のビットです。

関連する問題