来自串行相机的JPEG图像未加载C#BitmapImage

时间:2012-02-29 19:56:48

标签: c# wpf jpeg

我正在编写一个程序,它从通过串行端口连接的摄像机抓取JPEG图像。我想以编程方式在WPF中定义一个图像,以便在使用Image的Source属性进行检索后显示它。

我找到了

image1.Source = new BitmapImage(new Uri(Environment.CurrentDirectory + @"/" + photo + ".jpg"));

大多数图像都能正常工作,但出于某种原因,它不喜欢这款相机的图像。任何比我更了解JPEG的人都可以看看它,看看它为什么会出问题吗?

http://dl.dropbox.com/u/2434899/0%20%282%29.jpg

编辑:经过一番调查,我确定它可能是WPF / C#不喜欢的JFIF头数据。有没有简单的方法在程序中纠正它?

编辑2:我相信我发现了问题。相机的JFIF标头数据是完整的垃圾。它基本上只有0-10 ......最后还是要用Hex编辑器来阅读它。我从工作文件中复制了JFIF标题,现在没问题了。我猜想,只需编辑每个标题即可。

有关使用本相机遇到此问题的任何人的信息:

http://www.4dsystems.com.au/prod.php?id=75

似乎每张照片都会显示相同的垃圾邮件标题信息:

FF D8 FF E0 00 11 4A 46 49 46 00 01 02 03 04 05 06 07 08 09 0A FF DB

并且它与JFIF标准中的任何内容都不匹配:

http://en.wikipedia.org/wiki/JPEG_File_Interchange_Format

如果您只是用以下内容替换JFIF标头:

FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 60 00 60 00 00 FF DB

它会起作用。只需读取文件,直到“FF DB”也在垃圾邮件标题中 - 它似乎是标题的“停用词” - 然后换掉它。

还有第二批似乎是标题信息的东西,一直持续到字节26E ......并且它在我这里的两个图像中似乎都是相同的,但它似乎不是C#加载问题的原因。它在JFIF中看起来不像什么,所以我不确定。

1 个答案:

答案 0 :(得分:1)

我很遗憾地说,但我认为这张图片“很糟糕”。我认为保存此图像的图像流没有正确关闭/处理。我在XAML中加载了图像并得到错误:

HRESULT的异常:0x88982F72

然后我在Paint / Photoshop中打开图像并重新保存。我在XAML中打开了重新保存的图像,没有错误。它看起来像Photoshop读得很好,当它保存时,它保存正确