我需要在从OFD打开后保存图像。 这是我的代码atm:
Dim ofd As New OpenFileDialog
ofd.Multiselect = True
ofd.ShowDialog()
For Each File In ofd.FileNames
Image.FromFile(File).Save("C:\Users\Jonathan\Desktop\e\tmp.png", Imaging.ImageFormat.png)
Next
在Image.FromFile(File).Save("C:\Users\Jonathan\Desktop\e\tmp.png", Imaging.ImageFormat.png)
行上,它出现了错误。
(注意:应用程序将建立在这样,这只是我的第一个代码,它需要保存而不是复制)
答案 0 :(得分:16)
我会检查两件事:
答案 1 :(得分:6)
打开或保存图像会锁定文件。覆盖此文件需要首先在持有锁的Image对象上调用Dispose()。
我真的不了解您的代码,但您必须这样做:
For Each File In ofd.FileNames
Using img As Image = Image.FromFile(File)
img.Save("C:\Users\Jonathan\Desktop\e\tmp.png", Imaging.ImageFormat.Png)
End Using
Next
Using语句确保释放img对象并释放文件锁。
答案 2 :(得分:1)
图像放锁。
例如,我使用此缓冲区图像保存到内存流中。
byte[] ImageData = new Byte[0];
if (BackGroundImage != null)
{
Bitmap BufferImage = new Bitmap(BackGroundImage);
MemoryStream ImageStream = new MemoryStream();
BufferImage.Save(ImageStream, ImageFormat.Jpeg);
BufferImage.Dispose();
ImageData = ImageStream.ToArray();
ImageStream.Dispose();
//write the length of the image data...if zero, the deserialier won't load any image
DataStream.Write(ImageData.Length);
DataStream.Write(ImageData, 0, ImageData.Length);
}
else
{
DataStream.Write(ImageData.Length);
}
答案 3 :(得分:0)
这样做的一个原因是您已经处理了从主图像加载的流(MemoryStream或任何其他流)!
这种情况:
这是一个将字节数组转换为位图的扩展方法,但using语句将处理内存流,这将始终导致此错误:
public static Bitmap ToBitmap(this byte[] bytes)
{
if (bytes == null)
{
return null;
}
else
{
using(MemoryStream ms = new MemoryStream(bytes))
{
return new Bitmap(ms);
}
}
}