将JPEG图像转换为字节数组 – COMexception

使用C#,我正在尝试从磁盘加载JPEG文件并将其转换为字节数组。 到目前为止,我有这个代码:

static void Main(string[] args) { System.Windows.Media.Imaging.BitmapFrame bitmapFrame; using (var fs = new System.IO.FileStream(@"C:\Lenna.jpg", FileMode.Open)) { bitmapFrame = BitmapFrame.Create(fs); } System.Windows.Media.Imaging.BitmapEncoder encoder = new System.Windows.Media.Imaging.JpegBitmapEncoder(); encoder.Frames.Add(bitmapFrame); byte[] myBytes; using (var memoryStream = new System.IO.MemoryStream()) { encoder.Save(memoryStream); // Line ARGH // mission accomplished if myBytes is populated myBytes = memoryStream.ToArray(); } } 

但是,执行ARGH行给我的信息是:

COMException未处理。 句柄无效。 (HRESULTexception:0x80070006(E_HANDLE))

我不认为文件Lenna.jpg有什么特别之处 – 我是从http://computervision.wikia.com/wiki/File:Lenna.jpg下载的。 你能说出上面的代码有什么问题吗?

查看本文中的示例: http : //www.codeproject.com/KB/recipes/ImageConverter.aspx

最好使用System.Drawing

 Image img = Image.FromFile(@"C:\Lenna.jpg"); byte[] arr; using (MemoryStream ms = new MemoryStream()) { img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); arr = ms.ToArray(); } 

其他建议:

 byte[] image = System.IO.File.ReadAllBytes ( Server.MapPath ( "noimage.png" ) ); 

应该不仅适用于图像。

 public byte[] imageToByteArray(System.Drawing.Image imageIn) { MemoryStream ms = new MemoryStream(); imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif); return ms.ToArray(); } 

发生此错误的原因是您使用的BitmapFrame.Create()方法默认为OnDemand加载。 在调用encoder.Save之前,BitmapFrame不会尝试读取与之关联的流,此时流已经被释放。

您可以将整个函数包装在using {}块中,也可以使用替代的BitmapFrame.Create(),例如:

 BitmapFrame.Create(fs, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);