【问题标题】:generic error in gdi+ decoding a valid jpeggdi+ 解码有效 jpeg 中的一般错误
【发布时间】:2012-11-21 18:58:09
【问题描述】:

我有一个从相机拍摄的有效 jpeg 帧:

http://www.developerinabox.com/test.jpg

我正在使用以下(示例)代码加载它:

using System.Net;
using System.Drawing;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            WebRequest req = WebRequest.Create("http://www.developerinabox.com/test.jpg");
            req.Timeout = 5000;
            WebResponse resp = null;


            resp = req.GetResponse();
            if (resp != null)
            {
                var s = resp.GetResponseStream();
                if (s != null)
                {
                    Image img = Image.FromStream(s); //<-- Error thrown here
                }
            }


        }
    }
}

在 Windows XP/Vista/7 中,这可以正常工作。

在 Windows 8 中,它因“gdi+ 中的一般错误”而失败,我尝试通过 WPF 加载它,结果相同。

我可以在我的 Windows 8 PC 上用谷歌浏览器显示图像,但不能在 IE 中显示。它将同时显示在 Windows XP/Vista/7 上。

我可以在 Fireworks 中的 Windows 8 盒子上打开它,但尝试在绘图中打开它会给我:

“这不是一个有效的位图文件,或者它的格式目前不受支持。”

有什么想法吗?

【问题讨论】:

    标签: c# winforms windows-8 gdi+


    【解决方案1】:

    实际上,这是一个无效的 JPEG 图像,但正如您所见,许多应用程序可以无缝地解码此图像。此 JPEG 图像有一个伪造的 SOS 标记(抱歉提供技术信息),此 Scan header (SOS) 表示此图像有 1 个颜色分量,但 Frame header (SOF ,在 JPEG 文件结构中出现在 SOS 之前)声称它是一个 3 组件图像。

    因此 Scan 标头 的信息少于所需的信息,但缺失的信息可以用默认值替换,并且 JPEG 图像应该可以毫无问题地解码,这正是正在发生的事情。缺少的信息是 Huffman 表索引,这些索引的默认集可以基于 JPEG 编码类型(顺序、渐进或无损)来假设。

    嗯,在 JPEG 解码方面,Win8 似乎更严格。如果您好奇,可以查看this code我为另一个 JPEG 相关问题上传(它在 VB.NET 中编码),您可以对其进行调试以了解问题所在(您也应该检查 JPEG 规范)。


    编辑: 毕竟这是一张有效的 JPEG 图片

    此 JPEG 是基线多扫描顺序图像(类似于平面图像),不要与渐进图像混淆(类似于隔行扫描图像)。所以这个 JPEG 有一个较小的 Scan header 因为图像一次被解码一个组件。因此,该文件有 3 个不连续的扫描标头 (SOS for 1st component, compressed data, SOS for 2nd component, compressed data,...),每个扫描标头 都包含单个组件的信息。
    最后,如果问题是不完整的或伪造的扫描标头,会有一种解决方法(您可以修复伪造的 SOS 标头),但事实并非如此。因此,您可以向 MS 人员提出请求,要求在 Win8 上支持 多扫描顺序 JPEG 图像;-) 或使用一些第三方 JPEG 解码库。

    【讨论】:

    • 太好了 - 非常感谢。你是用什么发现的?知道我能做些什么来让它显示吗?不幸的是,无法更改相机上的固件...
    • 抱歉回复晚了。我发现它是一个有效的 JPEG 文件。检查我的编辑...
    猜你喜欢
    • 2010-11-11
    • 2010-11-06
    • 1970-01-01
    • 2011-03-01
    相关资源
    最近更新 更多