位图保存 jpeg 失败但 png 可以,因为 comments 属性
Posted
技术标签:
【中文标题】位图保存 jpeg 失败但 png 可以,因为 comments 属性【英文标题】:bitmap save jpeg failled but png is ok because of the comments property 【发布时间】:2013-07-22 03:29:17 【问题描述】:问题描述:
当我将位图保存为 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);
我发现了什么:
经过深入调查,我发现问题的根源在于原始图像的评论属性。当我删除属性值时,错误消失了。另外,我只要把图片的cmets值复制到记事本再粘贴回来,就可以用上面的代码保存成一个新的图片,而且图片的尺寸更大!
所以,我猜 cmets 属性在保存到 jpeg 文件时可能包含一些敏感或不正确的字符。各位能不能给我们一些关于这些 cmets 的见解?
先谢谢了。
更多尝试:
我试试下面的代码:
//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,仍然会引发异常。
请帮帮我:
-
当我清除 cmets 然后将相同的值粘贴回去时,为什么图像尺寸更大(原始尺寸为 48k,剪切并粘贴回来后约为 78k)。这可能是一个错误吗?
为什么我清除了cmets然后把相同的值粘贴回去后图像可以成功保存?是剪贴板过滤了一些无效字符吗?
为什么我把cmets属性值设置为null还是不能保存图片?但如果我删除该属性,它可以像我尝试之前一样工作?
希望您能帮我找出问题的根源。
【问题讨论】:
【参考方案1】:我从 MSDN 找到了问题的根源 http://social.msdn.microsoft.com/Forums/en-US/83b24aa5-511f-47cd-856a-4fbbb5688ddf/bitmap-save-jpeg-failled-but-png-is-ok-because-of-the-comments-property
原始注释似乎使用 ASCII 编码,但 GDI+ 自动将其转换为 Unicode。注释已经很大,转换为 Unicode 后它的大小会增加一倍,并且超过了 EXIF 块的最大大小(64 KB)。
【讨论】:
以上是关于位图保存 jpeg 失败但 png 可以,因为 comments 属性的主要内容,如果未能解决你的问题,请参考以下文章