位图保存 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 属性的主要内容,如果未能解决你的问题,请参考以下文章

加载的位图与jpeg中保存的位图不同(c#)

如何保存位图

将大型光栅图形图像(位图、PNG、JPEG 等)转换为非矢量 postscript

将Android中的位图保存为外部存储中的JPEG文件夹

delphi处理jpeg问题

图片加载原理