2011-01-19 5 views
13

Tôi muốn chuyển đổi một BitmapImage thành ByteArray trong một ứng dụng Windows Phone 7. Vì vậy, tôi đã thử điều này nhưng nó ném ngoại lệ thời gian chạy "Invalid Pointer Exception". Bất cứ ai có thể giải thích lý do tại sao những gì tôi đang cố gắng để làm ném một ngoại lệ. Và bạn có thể cung cấp giải pháp thay thế cho điều này không.Chuyển đổi BitmapImage thành mảng Byte

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

Trả lời

17

Vâng, tôi có thể làm cho đoạn code bạn đã có đơn giản hơn đáng kể:

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

... nhưng điều đó có lẽ sẽ không giải quyết vấn đề.

Một vấn đề khác là bạn chỉ sử dụng kích thước của bitmapImage - bạn có nên sao chép mã này vào btmMap tại một số điểm không?

Có bất cứ lý do bạn không chỉ sử dụng này:

WriteableBitmap btmMap = new WriteableBitmap(bitmapImage); 

Bạn có thể cho chúng tôi biết thêm thông tin về nơi lỗi xảy ra?

+0

Thực ra, tôi đã sử dụng các điều trên, WriteableBitmap btmMap = WriteableBitmap mới (BitmapImage); Trước đây tôi đã cho thấy điều sai trái. nhưng nó vẫn hiển thị cùng một lỗi "Invalid Pointer". – dinesh

+2

Khi tôi cố gắng sử dụng phương pháp của bạn, tôi gió lên nhận được một hình ảnh màu đen trừ khi tôi khởi tạo btmMap thành một WritableBitmap bằng cách sử dụng BitmapImage trong hàm tạo. Tôi không chắc chắn nếu tôi thiếu một số loại thiết lập nhưng tôi nghĩ tôi sẽ đề cập đến nó. –

+0

bạn có thể đề nghị một cách để làm điều đó trong Windows 8 RT? – Mayank

7

Tôi không chắc chắn vấn đề của bạn là chính xác những gì, nhưng tôi biết rằng đoạn mã sau là một rất thay đổi nhỏ từ mã mà tôi biết công trình (mỏ đã đi qua trong một WriteableBitmap, không phải là một 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

Tôi đã tạo bitmapImage bằng cách sử dụng URI, điều này có tạo ra vấn đề cho tôi không? – dinesh

+0

Tôi không thấy lý do tại sao nó không nên; trừ khi bạn không đợi cho đến khi hình ảnh thực sự được tải xuống trước khi bạn thử và lấy byte [] từ nó. –

+1

Bây giờ tôi đã nhận được giải pháp, vấn đề là không thể tạo đối tượng WritableBitmap vì, đối tượng BitmapImage được tạo bằng cách sử dụng URI tương đối. vì vậy nó không nhận được hình ảnh thực sự. vì vậy tôi đã thay đổi mã: Insted của WriteableBitmap wBitmap = new WriteableBitmap (bitmapImage); Chúng ta phải làm như sau ... Image image = new Image(); image.SetSource (bitmapImage); WriteableBitmap wBitmap = new WriteableBitmap (hình ảnh, null); Bây giờ tôi có thể tạo đối tượng WritableBitmap – dinesh

1

tôi đã cùng một vấn đề, điều này giải quyết nó:

Mã trước:

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

Mã sau:

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