2011-09-14 24 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()メソッドOnDemandロード。 BitmapFrameは、encoder.Saveを呼び出すまで関連付けられているストリームを読み込もうとしません。この時点で、ストリームはすでに破棄されています。

あなたが)を使用して、{}ブロック全体機能をラップ、または代替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")); 

画像だけでなく、

関連する問題