c# - 位图保存 jpeg 失败但 png 可以,因为注释属性

标签 c# bitmap save

问题描述:

当我以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);

我发现了什么:

经过深入调查,我发现问题的根源在于原始图像的评论属性。当我删除属性值时,错误消失。另外,我只要把图片的注释值复制到记事本里再粘贴回来,用上面的代码就可以把图片保存成新的图片,而且图片的尺寸更大了! enter image description here

因此,我猜测在保存到 jpeg 文件时,注释属性可能包含一些敏感或不正确的字符。伙计们可以就这些评论给我们一些见解吗?

提前致谢。

更多尝试:

我试试下面的代码:

        //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后还是保存不了图片?但如果我删除该属性,它就可以工作,就像我尝试之前一样?

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

最佳答案

我已经从 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 block 的最大大小(64 KB)。

关于c# - 位图保存 jpeg 失败但 png 可以,因为注释属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17779499/

相关文章:

c# - DPI 感知和 Rect

c++ - 为什么即使不使用指向指针的指针作为参数调用该函数,它也能正常工作?

java - 如何制作保存按钮

c++ - 以 TIFF 格式保存一堆图像

c# - 你如何在 C# 中读取 NASA .hgt 文件?

c# - Azure 容器应用服务。 Docker 运行参数?

c# - 使用 spring.net 将类注入(inject)到 using 语句中

javascript - 连续文本框验证

java - 如何将图像从 Java 应用程序发送到 Android 应用程序?

android - 如何将 ImageView 另存为图像?