2011-09-14 15 views
15

C# kullanarak, bir JPEG dosyasını diskten yüklemeyi ve bir bayt dizisine dönüştürmeyi deniyorum.Bir JPEG resmini bir bayt dizisine dönüştürme - COM istisnası

COMException işlenmeyen oldu:

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(); 
    } 
} 

Ancak çizgi ARGH yürütme bana mesaj veriyor: Şimdiye kadar bu kodu var. Sap geçersiz. ( HRESULT özel durum: 0x80070006 (E_HANDLE))

Ben dosyası Lenna.jpg hakkında özel bir şey olduğunu düşünmüyorum - Ben http://computervision.wikia.com/wiki/File:Lenna.jpg indirmiş. Yukarıdaki kodda neyin yanlış olduğunu söyleyebilir misiniz?

cevap

3

bu hata olur nedeni olan sınıfları kullanmak daha iyidir çünkü varsayılan olarak kullandığınız BitmapFrame.Create() yöntemi OnDemand yükü. BitmapFrame, kodlayıcının çağrıldığı noktaya kadar ilişkilendirildiği akışı okumaya çalışmaz. Akış, hangi noktada akışa atılmıştır.

kullanarak {} bloğunda tüm işlev kaydırmak ya da bu gibi), (alternatif BitmapFrame.Create kullanabilir ya:

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

diğer öneri:

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

Sadece fotoğraflarla çalışmak zorunda değil.