C# 使用JpegBitmapDecoder从字节数组加载图像时发生ArgumentException

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

我在课堂上阅读JPEG文件时遇到了一些问题。我需要从JPEG文件加载元数据和位图。到目前为止,我有:

    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窗体工具读取元数据?