我有一个从相机中获取的有效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盒子上打开它,但是试图用油漆打开它给我:
“这不是有效的位图文件,或者当前不支持其格式。”
有什么想法吗?
答案 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解码库。