将JPEG图像转换为字节数组 - COM异常

28

我正在使用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。句柄无效。(来自 HRESULT: 0x80070006 (E_HANDLE) 的异常)

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

4个回答

59

请查看这篇文章中的示例: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();
}

如果我不知道图像文件的确切类型,我该怎么做呢?我的意思是,无论是JPEG还是GIF,我该如何保存这两个文件? - So_oP
这很有帮助,但是img.Save()应该将img.RawFormat作为第二个参数而不是ImageFormat.Jpeg。上面的代码可以工作,但这应该有助于使用其他格式的所有人。 - keeehlan

29

其他建议:

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

不仅应该与图像一起使用,而且应该适用于其他类型的内容。


5
public byte[] imageToByteArray(System.Drawing.Image imageIn)  
{   
 MemoryStream ms = new MemoryStream();     

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

3

出现此错误的原因是您使用的 BitmapFrame.Create() 方法默认为按需加载。BitmapFrame 不会尝试读取与其关联的流,直到调用 encoder.Save,此时流已被处理。

您可以将整个函数包装在 using {} 块中,或者使用其他 BitmapFrame.Create(),例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接