位图保存jpeg失败,但由于comments属性,png是可以的

时间:2013-07-22 03:29:17

标签: c# bitmap save

问题描述:

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

快速重新创建:

  1. 请将照片保存到broswer的.jpg文件中。点击此处:IncorrectImageCorrectImage。(实际上,在我们的应用程序中,我们动态请求图像,然后将图像保存为JPEG。)

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

    string newFile = @"D:\Temp\newImage.jpg"; var newBitmap = Image.FromFile(@"D:\Temp\IncorrectImage.jpg"); newBitmap.Save(newFile,System.Drawing.Imaging.ImageFormat.Jpeg);

  3. 我找到了什么:

    经过深入调查后,我发现问题的根源来自原始图像的评论属性。当我删除属性值时,错误消失。此外,在我将图像的注释值的值复制到记事本然后粘贴之后,可以将图像保存到具有较高代码的新图像中,并且图像的尺寸甚至更大! enter image description here

    所以,我想当保存到jpeg文件时,comments属性可能包含一些敏感或不正确的charector。人们可以就这些评论提供一些见解吗?

    先谢谢。

    更多尝试:

    我尝试以下代码:

            //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);
    

    如果删除属性项,则可以成功保存newimage。但是,如果我只是像注释掉代码那样将其值设置为null,则仍会抛出异常。

    请帮帮我:

    1. 当我清除注释然后再粘贴相同的值时,为什么图像尺寸更大(原始尺寸为48k,切割后粘贴后约为78k)。可能是一个错误吗?
    2. 清除注释后粘贴相同值后,为什么可以成功保存图像?是剪贴板过滤一些无效的特征吗?
    3. 为什么即使我设置了comments属性值为null,图像仍然无法保存?但如果我删除该属性,它可以工作,就像之前我尝试?
    4. 希望你能帮助我找出问题的根源。

1 个答案:

答案 0 :(得分: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千字节)。