gdi中的泛型错误+解码有效的jpeg

时间:2012-11-01 01:27:44

标签: c# winforms windows-8 gdi+

我有一个从相机中获取的有效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盒子上打开它,但是试图用油漆打开它给我:

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

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

实际上,它是无效的JPEG图像但是,正如您所看到的,许多应用程序可以无缝地解码此图像。此JPEG图像有一个虚假的SOS标记(对于技术信息很抱歉),此扫描标题(SOS)表示此图像有1个颜色分量,但帧标题(SOF) ,出现在JPEG文件结构中的SOS之前)声称它是 3 组件图像。

因此扫描标题的信息少于所需信息,但缺少的信息可以替换为默认值,JPEG图像应该被解码而没有任何问题,这正是发生的事情。丢失的信息是霍夫曼表索引,这些索引的默认集合可以基于JPEG编码类型(顺序,渐进或无损)来假设。

嗯,在JPEG解码方面,似乎Win8更严格。如果您好奇,可以查看this code我上传的其他JPEG相关问题(用VB.NET编码),您可以调试它以了解问题所在(您还应该检查JPEG规范)

<小时/> 编辑: 毕竟是

后的有效JPEG图片

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