我正在使用以下代码行从文件中打开Image
:
pictureBox1.Image = Image.FromFile("test.png");
我希望它能锁定文件,将图像加载到内存中,将pictureBox1.Image
设置为内存中的副本,然后释放锁定。实际上,在内存中Dispose()
的{{1}}之前,锁定不会消失。我无法释放我不再使用的硬盘上的文件锁,直到我删除了内存中我 使用的文件。
微软的网站在一篇带有C#标签的文章中提及它,但他们的解决方案是用 visual basic 编写的,这对我来说毫无用处。
总结:
我想将Image
设置为pictureBox1.Image
中存储的图片,然后让用户编辑或删除"test.png"
或其他内容。
答案 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;`