2011-01-19 43 views
13

Chcę przekonwertować bitmapimage na ByteArray w aplikacji Windows Phone 7. Próbowałem tego, ale rzucił wyjątek Runtime "Invalid Pointer Exception". Czy ktoś może wyjaśnić, dlaczego to, co próbuję zrobić, rzuca wyjątek. Czy możesz podać alternatywne rozwiązanie tego problemu.Konwersja bitmapy do tablicy bajtów

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

Odpowiedz

17

Cóż mogę uczynić kod mam znacznie prostsze:

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

... ale to prawdopodobnie nie rozwiąże problemu.

Inną kwestią jest to, że jesteś zawsze tylko na podstawie rozmiaru z bitmapImage- nie powinno być kopiowania na btmMap że w pewnym momencie?

Czy jest jakiś powód, dla którego nie jesteś po prostu przy użyciu to:

WriteableBitmap btmMap = new WriteableBitmap(bitmapImage); 

możesz dać nam więcej informacji o tym, gdzie pojawia się błąd?

+0

Właściwie Użyłem powyższą rzecz, WriteableBitmap btmMap = new WriteableBitmap (BitmapImage); Wcześniej pokazałem niewłaściwą rzecz. ale wciąż pokazuje ten sam błąd "nieprawidłowy wskaźnik". – dinesh

+2

Kiedy próbuję użyć twojej metody, kończę otrzymywanie czarnego obrazu, chyba że zainicjuję btmMap na WritableBitmap używając BitmapImage w konstruktorze. Nie jestem pewien, czy brakuje mi jakiejś konfiguracji, ale pomyślałem, że o tym wspomnę. –

+0

czy możesz zaproponować sposób, aby to zrobić w systemie Windows 8 RT? – Mayank

7

nie jestem pewien dokładnie, jaki jest twój problem, ale wiem, że następujący kod jest bardzo drobna zmiana z kodu, który znam prace (kopalnia mijał w WriteableBitmap, nie BitmapImage):

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

Stworzyłem bitmapImage przy użyciu URI, czy to stwarza dla mnie problem? – dinesh

+0

Nie widziałem, dlaczego nie powinno; chyba że nie czekasz, aż obraz rzeczywiście zostanie pobrany, zanim spróbujesz pobrać bajt [] z niego. –

+1

Teraz mam rozwiązanie, problem nie jest w stanie stworzyć obiektu WritableBitmap, ponieważ obiekt BitmapImage jest tworzony przy użyciu URI, który jest względny. więc nie dostanie prawdziwego obrazu. więc zmieniłem kod: Zainstalowałem tę WriteableBitmap wBitmap = new WriteableBitmap (bitmapImage); Musimy wykonać następujące czynności ... Image image = new Image(); image.SetSource (bitmapImage); WriteableBitmap wBitmap = new WriteableBitmap (image, null); Teraz mogę utworzyć obiekt WritableBitmap – dinesh

1

miałem ten sam problem, to rozwiązuje go:

Code wcześniej:

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

kod po:

BitmapImage bi = new BitmapImage(); 
bi.CreateOptions = BitmapCreateOptions.None; 
bi.SetSource(e.ChosenPhoto); 
WriteableBitmap wb = new WriteableBitmap(bi); 
Powiązane problemy