2011-01-19 54 views
13

Bir Windows Phone 7 uygulamasında BitmapImage'ı ByteArray'e dönüştürmek istiyorum. Bu yüzden denedim ama çalışma zamanı özel durum "geçersiz işaretçi özel durum" atar. Herkes neden yapmaya çalıştığımın bir istisna attığını açıklayabilir. Bunun için alternatif bir çözüm sağlayabilir misiniz?BitmapImage öğesinin Bayt dizisine dönüştürülmesi

public static byte[] ConvertToBytes(this BitmapImage bitmapImage) 
    { 
     byte[] data; 
     // Get an Image Stream 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      WriteableBitmap btmMap = new WriteableBitmap(bitmapImage); 

      // write an image into the stream 
      Extensions.SaveJpeg(btmMap, ms, 
       bitmapImage.PixelWidth, bitmapImage.PixelHeight, 0, 100); 

      // reset the stream pointer to the beginning 
      ms.Seek(0, 0); 
      //read the stream into a byte array 
      data = new byte[ms.Length]; 
      ms.Read(data, 0, data.Length); 
     } 
     //data now holds the bytes of the image 
     return data; 
    } 

cevap

17

Eh ben oldukça basit var kodunu yapabilirsiniz:

public static byte[] ConvertToBytes(this BitmapImage bitmapImage) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     WriteableBitmap btmMap = new WriteableBitmap 
      (bitmapImage.PixelWidth, bitmapImage.PixelHeight); 

     // write an image into the stream 
     Extensions.SaveJpeg(btmMap, ms, 
      bitmapImage.PixelWidth, bitmapImage.PixelHeight, 0, 100); 

     return ms.ToArray(); 
    } 
} 

... ama muhtemelen sorunu çözmez. bir noktada btmMap üzerine bunu kopyalama edilmemelidir -

diğer konu

yalnızca hiç boyutu bitmapImage ait kullandığınız bu?

WriteableBitmap btmMap = new WriteableBitmap(bitmapImage); 

bize hata oluşur yerler hakkında daha fazla bilgi verebilir:

herhangi sadece bu kullanmadığınız sebebi var mı?

+0

, yukarıdaki şeyi kullandım, WriteableBitmap btmMap = new WriteableBitmap (BitmapImage); Daha önce yanlış şeyi gösterdim. Ama yine de aynı hata "Geçersiz İşaretçi" gösterir. – dinesh

+2

Yönteminizi kullanmaya çalıştığımda, btmMap'i yapıcıdaki BitmapImage'ı kullanarak bir WritableBitmap'e başlatmadığım sürece siyah bir görüntü almayı tercih ediyorum. Bir tür kurulumun eksik olup olmadığından emin değilim ama bahsetmeyi düşündüm. –

+0

Windows 8 RT'de bunu yapmanın bir yolunu önerebilir misiniz? – Mayank

7

Ben senin sorunun tam olarak ne olduğundan emin değilim, ama şu kod ben çalıştığını biliyorum koddan bir çok küçük değişiklik (madeni WriteableBitmap değil, bir BitmapImage geçiyordu) olduğunu biliyoruz:

public static byte[] ConvertToBytes(this BitmapImage bitmapImage) 
{ 
    byte[] data = null; 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     WriteableBitmap wBitmap = new WriteableBitmap(bitmapImage); 
     wBitmap.SaveJpeg(stream, wBitmap.PixelWidth, wBitmap.PixelHeight, 0, 100); 
     stream.Seek(0, SeekOrigin.Begin); 
     data = stream.GetBuffer(); 
    } 

    return data; 
}
+0

URI kullanarak bitmapImage oluşturdum, bu benim için bir sorun yaratıyor mu? – dinesh

+0

Neden olmasın diye bir şey görmedim; Görüntüyü indirmeden önce beklemediğiniz sürece, bayt [] 'ı denemeden önce görüntü gerçekten indirilir. –

+1

Şimdi çözüm aldım, sorun WritableBitmap nesnesini oluşturamıyor çünkü BitmapImage nesnesi göreceli olan URI kullanılarak oluşturuldu. Yani gerçek imajı almaz. Bu yüzden kodu değiştirdim: Bu WriteableBitmap wBitmap = yeni WriteableBitmap (bitmapImage); Aşağıdakileri yapmak zorundayız ... Image image = new Image(); WriteableBitmap wBitmap = new WriteableBitmap (image, null); Artık WritableBitmap nesnesini oluşturabiliyorum – dinesh

1

Ben, bunu çözer aynı sorunu vardı:

Kod önce:

BitmapImage bi = new BitmapImage(); 
bi.SetSource(e.ChosenPhoto); 
WriteableBitmap wb = new WriteableBitmap(bi); 

Kod sonra: Aslında

BitmapImage bi = new BitmapImage(); 
bi.CreateOptions = BitmapCreateOptions.None; 
bi.SetSource(e.ChosenPhoto); 
WriteableBitmap wb = new WriteableBitmap(bi); 
İlgili konular