C# 使用JpegBitmapDecoder从字节数组加载图像时发生ArgumentException
我在课堂上阅读JPEG文件时遇到了一些问题。我需要从JPEG文件加载元数据和位图。到目前为止,我有:C# 使用JpegBitmapDecoder从字节数组加载图像时发生ArgumentException,c#,.net,image,jpeg,C#,.net,Image,Jpeg,我在课堂上阅读JPEG文件时遇到了一些问题。我需要从JPEG文件加载元数据和位图。到目前为止,我有: public void Load() { using (Stream imageStream = File.Open(this.FilePath, FileMode.Open, FileAccess.Read, FileShare.Read)) { BitmapDecoder decoder = new JpegBitmap
public void Load()
{
using (Stream imageStream = File.Open(this.FilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
BitmapDecoder decoder = new JpegBitmapDecoder(imageStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
BitmapSource source = decoder.Frames[0];
// load metadata
this.metadata = source.Metadata as BitmapMetadata;
// prepare buffer
int octetsPerPixel = source.Format.BitsPerPixel / 8;
byte[] pixelBuffer = new byte[source.PixelWidth * source.PixelHeight * octetsPerPixel];
source.CopyPixels(pixelBuffer, source.PixelWidth * octetsPerPixel, 0);
Stream pixelStream = new MemoryStream(pixelBuffer);
// load bitmap
this.bitmap = new Bitmap(pixelStream); // throws ArgumentException
}
this.status = PhotoStatus.Loaded;
}
但是位图构造函数在尝试从流创建位图实例时抛出ArgumentException
报告说:
系统参数异常
流不包含图像数据或为空
-或-
流包含单个尺寸大于65535像素的PNG图像文件
我不确定我做错了什么。你能帮帮我吗?你使用的是
位图
构造器,它通常用于加载一个已知格式的图像文件-JPEG、PNG等。相反,你只有一堆字节,你没有告诉它任何你想使用的格式
不清楚您为什么要使用BitmapDecoder和BitmapSource-为什么不使用:
Stream imageStream = File.Open(this.FilePath, FileMode.Open,
FileAccess.Read, FileShare.Read));
this.bitmap = new Bitmap(imageStream);
请注意,此处不能使用using
语句-调用构造函数后,位图将“拥有”流
除此之外,您似乎试图将WPF和WinForms的图像想法混合在一起,我怀疑这通常是个坏主意:(我确信您已经检查过FilePath
指向Jpeg
?并且它实际上是一个Jpeg
,而不仅仅是这样命名的?嗯pixelStream
依赖于pixelBuffer
,它依赖于其他一些变量,您需要验证其中每一个都有好的值,这在调试器中很容易实现.@Chris O:我不确定如何轻松验证pixelBuffer的值。我不知道正确的值,因此无法比较它们。@失望先生:是的,FilePath指向有效的Jpeg文件。我之所以使用它,是因为我需要读取BitmapMetadata。还有其他方法读取它吗?因为我使用了元数据解码器,所以我使用它来读取位图嗯。@tomp:我想最简单的方法是读取一次文件以获取元数据,然后再次加载位图
。这不是很有效,但却是处理两种不同类型的图像库的最简单方法。在其余代码中,你真的需要位图而不是位图源吗?@Jon'Skeet:谢谢你的回答。我不确定我是否需要位图,我正计划对图像进行旋转或剪切等图像转换。这是我在.NET平台上的第一个项目,我只是还没有学习到最佳实践,但位图似乎是更好的解决方案。但是如果我不知道如何使用BitmapSource,我怎么能使用BitmapSource呢要从中获取位图?此外,我仍然不知道,除了WPF和WinForms的混合之外,我的代码到底出了什么问题。@tomp:您是在尝试编写WPF/Silverlight还是Windows窗体应用程序?使用相关工具包中的图像类-目前您使用的是混合,这永远不会有好结果。@Jon Skeet:Windows窗体应用程序p、 我可以使用哪些Windows窗体工具读取元数据?