web-dev-qa-db-ja.com

ファイルから画像を開き、ロックを解除しますか?

次のコード行を使用して、ファイルからImageを開きます。

_pictureBox1.Image = Image.FromFile("test.png");
_

ファイルをロックし、イメージをメモリにロードし、_pictureBox1.Image_をメモリ内のコピーに設定し、ロックを解除することを期待しています。実際には、メモリ内のImageDispose()までロックは解除されません。 memory I amを使用してファイルを削除するまで、使用していないハードドライブ上のファイルのロックを解除できません。
MicrosoftのサイトではC#ラベルの記事で言及されていますが、その解決策はvisual basicで書かれていますが、これは役に立たないです。

要約すると、_pictureBox1.Image_を_"test.png"_に保存されているイメージに設定し、ユーザーに_"test.png"_などを編集または削除させます。

67
Eagle-Eye

ストリームによるアプローチは正しくありません

こちらをご覧ください https://stackoverflow.com/a/8701748/355264

上記のリンクからの正しいコード:

Image img;
using (var bmpTemp = new Bitmap("image_file_path"))
{
    img = new Bitmap(bmpTemp);
}
82
net_prog

または、さらに良いことに、usingステートメントを使用します(以下のコードは、sylonの[削除]投稿からコピーされます)。 Image.FromStreamは例外をスローしますが、ストリームがすぐに閉じられることを保証できます。

using (FileStream stream = new FileStream("test.png", FileMode.Open, FileAccess.Read))
{
    pictureBox1.Image = Image.FromStream(stream);
}
47
JoshL

ストリームを使用して画像を読み取り、ストリームを閉じることもできます。

FileStream stream = new FileStream("test.png", FileMode.Open, FileAccess.Read);
pictureBox1.Image = Image.FromStream(stream);
stream.Close();
10
lahsrah

私が見つけた最も簡単な方法は、Source(ファイルへのパス)を含むオブジェクトをフリーズすることです。画像を含むことができるすべてのコントロールは、nullでない場合、それが指すファイルをロックする.Sourceを持っているようです。

ここでの秘trickは、Imageコントロールを「読み取り専用」状態に変更し、ファイルのロックを解除することです。

私の解決策:

    private Image CreatePreviewImage()
    {
        Image ReportImage = new Image();
        Uri path = new Uri(@"C:\Folder\Image1.png");
        if (File.Exists(path.OriginalString))
        {
            ReportImage.Name = "Report1";
            ReportImage.Source = LoadImageFromFile(path);
        }
        return ReportImage;
    }

    public ImageSource LoadImageFromFile(Uri path)
    {
        BitmapImage bitmap = new BitmapImage();
        bitmap.BeginInit();
        bitmap.UriSource = path;
        bitmap.CacheOption = BitmapCacheOption.OnLoad;
        bitmap.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
        bitmap.DecodePixelWidth = 900;
        bitmap.EndInit();
        bitmap.Freeze(); //This is the magic line that releases/unlocks the file.
        return bitmap;
    }
2
Rafael Ventura

開いて、読んで、リリースする

 StreamReader streamReader = new StreamReader( "picture.png"); 
ビットマップtmpBitmap =(ビットマップ)Bitmap.FromStream(streamReader.BaseStream); 
 streamReader.Close(); 
 pictureBox1.Image = tmpBitmap; `
 
0
psycobot