从文件打开图像,然后释放锁定?

时间:2011-07-04 21:51:50

标签: c# winforms image locking

我正在使用以下代码行从文件中打开Image

pictureBox1.Image = Image.FromFile("test.png");

我希望它能锁定文件,将图像加载到内存中,将pictureBox1.Image设置为内存中的副本,然后释放锁定。实际上,在内存中Dispose()的{​​{1}}之前,锁定不会消失。我无法释放我不再使用的硬盘上的文件锁,直到我删除了内存中我 使用的文件。
微软的网站在一篇带有C#标签的文章中提及它,但他们的解决方案是用 visual basic 编写的,这对我来说毫无用处。

总结: 我想将Image设置为pictureBox1.Image中存储的图片,然后让用户编辑或删除"test.png"或其他内容。

5 个答案:

答案 0 :(得分:78)

的方法不正确

请参阅此处https://stackoverflow.com/a/8701748/355264

从上面的链接中纠正代码:

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

答案 1 :(得分:47)

或者更好的是,使用using语句(以下代码是从sylon的[已删除]帖子中复制的)。这样,如果Image.FromStream抛出异常,您仍然可以确保流立即关闭。

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

答案 2 :(得分:9)

您还可以使用流来读取图像,然后关闭流。

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

答案 3 :(得分:2)

我发现最简单的方法是冻结包含Source(文件路径)的对象。所有可以包含图像的控件似乎都有一个.Source,如果不是null,它将锁定它指向的文件。

现在的诀窍是将Image控件更改为"只读" state,然后解锁文件。

我的解决方案:

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

答案 4 :(得分:0)

谈论开放,阅读和发布     

    StreamReader streamReader = new StreamReader("picture.png");
    Bitmap tmpBitmap = (Bitmap)Bitmap.FromStream(streamReader.BaseStream);
    streamReader.Close();
    pictureBox1.Image = tmpBitmap;`