我正在开发一个C#应用程序,其中我想做的第一件事是根据文件中的元数据旋转图像。这部分工作正常。但是将图像保存在现有图像的顶部是我遇到麻烦的地方。我删除原始文件,关闭流并尝试将图像保存为原始图像的名称,但它不起作用。我得到以下异常:
'System.Runtime.InteropServices.ExternalException' occurred in System.Drawing.dllAdditional information: A generic error occurred in GDI+.
这是我正在使用的代码。它与我的工作版本有点不同,如果我错过了什么,请原谅我。在我的原始版本中,我刚刚保存了
using (FileStream fs = new FileStream(item, FileMode.Open)) {
im = Image.FromStream(fs);
sourceFormat = im.RawFormat;
// Get the image orientation from the image metadata
PropertyItem pi = im.GetPropertyItem(274);
int orientation = pi.Value[0];
switch (orientation) {
// TODO: Set rotation and flips for all orientations
// case 1 - 5 & 7 removed for clarity
// break;
case 6:
encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Transformation, (long)EncoderValue.TransformRotate90);
edited = true;
pi.Value[0] = 1;
im.SetPropertyItem(pi);
fs.Close();
File.Delete(item);
im.Save(item, GetEncoder(sourceFormat), encoderParameters);
break;
case 8:
encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Transformation, (long)EncoderValue.TransformRotate270);
pi.Value[0] = 1;
im.SetPropertyItem(pi);
fs.Close();
File.Delete(item);
im.Save(item, GetEncoder(sourceFormat), encoderParameters);
break;
}
}
im.Dispose();
if (encoderParameters != null)
encoderParameters.Dispose();
}
答案 0 :(得分:1)
尝试将文件流设置为ReadWrite。另外,尽量不要Dispoose
。我相信这是你的主要问题。此外,在完成之前不要关闭fs
。我建议您在完成后使用它关闭fs
和图像。也许在功能结束时。
答案 1 :(得分:1)
我修改了您的代码以测试this解决方案(仅限证明,而不是重新实现您的实现)
encoderParameters.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Transformation, (long)System.Drawing.Imaging.EncoderValue.TransformRotate90);
//edited = true;
pi.Value[0] = 1;
im.SetPropertyItem(pi);
// Added new memorystream
System.IO.MemoryStream ms = new MemoryStream();
// Read into memorystream
im.Save(ms, GetEncoder(sourceFormat), encoderParameters);
fs.Close();
File.Delete(item);
// Read from memorystream into byte array
byte[] ni = ms.ToArray();
// Save out using new filestream.
using (FileStream nfs = new FileStream(item, FileMode.Create, FileAccess.ReadWrite)){
nfs.Write(ni, 0, ni.Length);
}
//im.Save(item, GetEncoder(sourceFormat), encoderParameters);