web-dev-qa-db-ja.com

JPEG画像をバイト配列に変換する-COM例外

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 からダウンロードしました。上記のコードの何が問題なのかわかりますか?

20
user181813

この記事の例を確認してください: 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();
}
46
Samich

その他の提案:

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

画像だけでなく動作するはずです。

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

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

このエラーが発生する理由は、使用しているBitmapFrame.Create()メソッドがデフォルトでOnDemandロードになっているためです。 BitmapFrameは、encoder.Saveが呼び出されるまで、関連付けられているストリームを読み取ろうとしません。この時点で、ストリームは既に破棄されています。

Using {}ブロックで関数全体をラップするか、次のような代替BitmapFrame.Create()を使用できます。

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