2011-09-14 55 views
15

使用C#,我试图从磁盘加载JPEG文件并将其转换为字节数组。到目前为止,我有这样的代码:将JPEG图像转换为字节数组 - COM异常

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了未处理。句柄无效。 (异常来自HRESULT :0x80070006(E_HANDLE))

我不觉得有什么特别之处文件Lenna.jpg - 我下载了它从http://computervision.wikia.com/wiki/File:Lenna.jpg。你能告诉上面的代码有什么问题吗?

回答

36

检查从本文的例子: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(); 
} 
3

这种错误发生的原因是因为您正在使用默认为BitmapFrame.Create()方法按需加载。在调用encoder.Save之前,BitmapFrame不会尝试读取它所关联的流,流的哪一点已经处理完毕。

你可以任一包裹整个函数在使用{}块,或使用替代BitmapFrame.Create(),如:

BitmapFrame.Create(fs, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
4
public byte[] imageToByteArray(System.Drawing.Image imageIn) 
{ 
MemoryStream ms = new MemoryStream();  

imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif); 
return ms.ToArray(); 
} 
7

其他建议:

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

应该不仅与图像工作。

相关问题