GDI 解码有效的JPEG中的通用错误



我有一个有效的JPEG框架,该框架是从相机中取的:

http://www.developererinabox.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加载它并以相同的结果加载。

我可以在Google Chrome中的Windows 8 PC上显示图像,但可以在IE中显示图像。它将在Windows XP/Vista/7中显示。

我可以在烟火中的Windows 8盒子上打开它,但是尝试在油漆中打开它给了我:

"这不是有效的位图文件,或者当前不支持其格式。"

有什么想法?

实际上,它是无效的JPEG映像>,但是,如您所见,许多应用程序可以无缝地解码此图像。此JPEG图像具有伪造的SOS标记(对不起,技术信息),此扫描标头(SOS)说此图像具有1个颜色组件,但是 frame> frame标头(sof(sof),在jpeg文件结构中出现的SOS之前出现)声称它是 3 组件图像。

因此,扫描标头的信息少于要求,但是丢失的信息可以用默认值替换,并且应在没有问题的情况下解码JPEG映像,这正是正在发生的事情。丢失的信息是可以根据JPEG编码类型(顺序,进行或无损)假设的Huffman表索引和默认集合。

好吧,在JPEG解码方面,Win8似乎更为严格。如果您很好奇,可以查看我在另一个JPEG相关问题上上传的代码(在vb.net中进行了编码),并且可以调试它以了解问题在哪里(您也应该检查JPEG规格)。p>


编辑:这是有效的JPEG映像,毕竟

此JPEG是基线多扫描顺序图像(类似于平面图像),不要与渐进式图像混淆(类似于交错图像)。因此,此JPEG具有较小的扫描标头,因为该图像一次是一个组件。因此,此文件具有3个非连接扫描标头SOS for 1st component, compressed data, SOS for 2nd component, compressed data,...),并且每个扫描标头具有单个组件的信息。
最后,如果问题是一个不完整或伪造的扫描标题,将会有解决方法(您可以修复伪造的SOS标头),但事实并非如此。因此,您可以向MS伙计们提出请求,要求支持多扫描顺序 jpeg jpeg图像win8 ;-)或使用一些第三方JPEG解码库。

相关内容

最新更新