public void EditAndSave(String fileName) {
Bitmap b = new Bitmap(fileName);
/**
* Edit bitmap b... draw stuff on it...
**/
b.Save(fileName); //<---------Error right here
b.Dispose();
}
我的代码与上面的代码类似。当我尝试保存刚刚打开的文件时,它将无法正常工作。当我尝试使用不同的路径保存它时,它工作正常。是不是文件已经在我的程序中打开所以无法写入?我很困惑。
答案 0 :(得分:1)
你是正确的,因为它被你的程序锁定,因此你不能写它。它在msdn页面上为Bitmap类解释(http://msdn.microsoft.com/en-us/library/3135s427.aspx)。
解决这个问题的一种方法(从我的头脑中,可能更简单的方法)将首先将图像缓存在内存流中并从那里加载它,从而能够关闭文件锁。
static void Main(string[] args)
{
MemoryStream ms = new MemoryStream();
using(FileStream fs = new FileStream(@"I:\tmp.jpg", FileMode.Open))
{
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
ms.Write(buffer, 0, buffer.Length);
}
Bitmap bitmap = new Bitmap(ms);
// do stuff
bitmap.Save(@"I:\tmp.jpg");
}
答案 1 :(得分:0)
我与你的情况并不完全相同,但是我的打开图像文件仍然存在问题。
一个建议是您使用BitmapCacheOption.OnLoad
将图片加载到内存中,请参阅我对这篇文章的回答:Locked resources (image files) management。
然后,在编辑之后,可以使用FileStream将该图像保存到同一文件中,例如:Save BitmapImage to File。
我不确定这是最简单或最优雅的方式,但我想它应该适合你。
答案 2 :(得分:0)
确实可能有很多理由看到这个例外。
请注意,如果您使用的是PixelFormat.Format16bppGrayScale
,则GDI +不支持它,并且会以显示的方式失败。似乎使用正确的16位灰度的唯一解决方法是使用WPF中较新的System.Windows.Media
命名空间。