我在课堂上阅读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。
System.ArgumentException
stream 不包含图片数据或为空。
-OR -
stream 包含一个大小超过65,535像素的PNG图像文件。
我不确定,我做错了什么。你能帮我吗?
答案 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的图像混合起来,我怀疑这是一个坏主意:(