使用JpegBitmapDecoder从字节数组加载图像时出现ArgumentException

时间:2011-04-05 13:07:50

标签: 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 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;
    }

但是当尝试从流创建Bitmap实例时,Bitmap构造函数会抛出ArgumentException。

documentation说:

  

System.ArgumentException

     

stream 不包含图片数据或为空。

     

-OR -

     

stream 包含一个大小超过65,535像素的PNG图像文件。

我不确定,我做错了什么。你能帮我吗?

1 个答案:

答案 0 :(得分:2)

你正在使用Bitmap构造函数,它通常用于以已知格式加载图像文件 - JPEG,PNG等。相反,你只有一堆字节,而你却不是告诉它任何关于你想要使用它们的格式。

目前尚不清楚为什么要使用BitmapDecoder和BitmapSource - 为什么不只是使用:

Stream imageStream = File.Open(this.FilePath, FileMode.Open,
                               FileAccess.Read, FileShare.Read));
this.bitmap = new Bitmap(imageStream);

请注意,您不得在此处使用using语句 - 在您调用构造函数后,Bitmap“拥有”该流。

除此之外,你似乎试图将WPF和WinForms的图像混合起来,我怀疑这是一个坏主意:(