2012-03-23 3 views
0

Ich verwende den folgenden Code versuchen, meine BitmapImage in ein Byte [] zu konvertieren, damit ich es in meiner MS SQL-Datenbank speichern kann.BitmapImage: Zugreifen auf geschlossene StreamSource

public static byte[] BufferFromImage(BitmapImage img) 
    { 
     if (img == null) 
      return null; 

      byte[] result = null; 
      using (Stream stream = img.StreamSource) 
      { 
       if (stream != null && stream.Length > 0) 
       { 
        using (BinaryReader br = new BinaryReader(stream)) 
        { 
         result = br.ReadBytes((int)(stream.Length)); 
        } 
       } 
      } 

      return result; 
     } 

Leider ist dies nicht als img.StreamSource arbeitet angeordnet ist, wenn ich versuche, darauf zuzugreifen in der if-Anweisung in einer Ausnahme resultierenden „kann nicht angeordnet Datei zugreifen“.

Mein Ruf: BufferFromImage(imgLogo.Source as BitmapImage);

Wie kann ich das vermeiden?

+0

Es scheint, Garbage Collection oder entsorgt werden, bevor das Verfahren vorbei. Könnten Sie den Code für frühere Arbeiten mit diesem BitmapImage veröffentlichen? –

+0

@Dmitriy Reznik: Ich verwende DevExpress 'WPF ImageEdit Control dafür. Ich habe den Code hinzugefügt. – SeToY

+0

Versuchen Sie, EditValue anstelle von Source zu verwenden. –

Antwort

3

ich es endlich geschafft, arbeitet es zu bekommen:

public static byte[] BufferFromImage(BitmapImage img) 
    { 
     byte[] result = null; 

     if (img != null) 
     { 
      using(MemoryStream memStream = new MemoryStream()) 
      { 
       JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
       encoder.Frames.Add(BitmapFrame.Create(img)); 
       encoder.Save(memStream); 

       result = memStream.ToArray(); 
      } 

     } 

     return result; 
    } 
+1

Verwenden Sie 'memStream.ToArray()', nicht 'memStream.GetBuffer()'. Der Puffer zurückgegeben von 'GetBuffer' wird unbenutzte (aber allokierte) Bytes am Ende enthalten. Dies nimmt nicht nur mehr Platz in der Datenbank ein, es kann auch dazu führen, dass das Bild nicht mehr geladen werden kann (wenn der Image Loader von der Eingabedatenlänge abhängig ist) –

+0

Vielen Dank für Ihren Hinweis, ich habe ihn in meinem Code geändert:) – SeToY

+0

Sie sollten den Strom noch einmal entsorgen, sobald Sie fertig sind. Das war der Punkt der using-Anweisung zuvor. – Xcalibur37