问题描述:
当我将位图保存为 JPEG 格式模式的 JPEG 文件时,抛出了 Gdi 异常。但是当我用PNG格式模式保存时,可以成功保存。
快速重建:
请将图像从浏览器保存为 .jpg 文件。点击这里:IncorrectImage , CorrectImage。(实际上,在我们的应用程序中,我们即时请求图像,然后将图像保存为 JPEG。)
使用以下代码查看异常:
string newFile = @"D:\Temp\newImage.jpg"; var newBitmap = Image.FromFile(@"D:\Temp\IncorrectImage.jpg"); newBitmap.Save(newFile,System.Drawing.Imaging.ImageFormat.Jpeg);
我发现了什么:
经过深入调查,我发现问题的根源在于原始图像的 Comments 属性。当我删除属性值时,错误消失了。另外,我只要把图片的评论值复制到记事本再粘贴回来,图片就可以用上面的代码保存成一个新的图片,而且图片的尺寸更大!
所以,我猜在保存到 jpeg 文件时,comments 属性可能包含一些敏感或不正确的字符。各位能不能就这些评论给我们一些见解?
提前致谢。
更多尝试:
我尝试以下代码:
//foreach (var item in newBitmap.PropertyItems)
//{
// if (item.Id == 37510)
// {
// item.Value = null;
// item.Len = 0;
// }
//}
newBitmap.RemovePropertyItem(37510);
newBitmap.Save(newFile, System.Drawing.Imaging.ImageFormat.Jpeg);
如果我删除属性项,则可以成功保存新图像。但是,如果我只是像注释掉代码一样将其值设置为 null,则仍然会引发异常。
请帮我:
- 为什么当我清除评论然后将相同的值粘贴回来时,图像尺寸更大(原始尺寸为 48k,剪切并粘贴回来后约为 78k)。有可能是一个错误吗?
- 为什么我清除评论然后将相同的值粘贴回来后可以成功保存图像?是剪贴板过滤了一些无效字符吗?
- 为什么即使我将comments属性值设置为null,图像仍然无法保存?但如果我删除该属性,它可以工作,就像我尝试之前一样?
希望你能帮助我找出问题的根源。