2

问题描述:

当我将位图保存为 JPEG 格式模式的 JPEG 文件时,抛出了 Gdi 异常。但是当我用PNG格式模式保存时,可以成功保存。

快速重建:

  1. 请将图像从浏览器保存为 .jpg 文件。点击这里:IncorrectImage , CorrectImage。(实际上,在我们的应用程序中,我们即时请求图像,然后将图像保存为 JPEG。)

  2. 使用以下代码查看异常:

    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,则仍然会引发异常。

请帮我:

  1. 为什么当我清除评论然后将相同的值粘贴回来时,图像尺寸更大(原始尺寸为 48k,剪切并粘贴回来后约为 78k)。有可能是一个错误吗?
  2. 为什么我清除评论然后将相同的值粘贴回来后可以成功保存图像?是剪贴板过滤了一些无效字符吗?
  3. 为什么即使我将comments属性值设置为null,图像仍然无法保存?但如果我删除该属性,它可以工作,就像我尝试之前一样?

希望你能帮助我找出问题的根源。

4

1 回答 1

1

我从 MSDN http://social.msdn.microsoft.com/Forums/en-US/83b24aa5-511f-47cd-856a-4fbbb5688ddf/bitmap-save-jpeg-failled-but-png找到了问题的根源- 没问题,因为评论属性

看来原始注释使用 ASCII 编码,但 GDI+ 自动将其转换为 Unicode。注释已经很大,转换为 Unicode 后,它的大小翻了一番,超过了 EXIF 块的最大大小(64 KB)。

于 2013-07-24T11:07:08.013 回答