2009-12-24 32 views
6

Tôi có thể chuyển đổi một byte [] để một hình ảnh:Silverlight: image để byte []

byte[] myByteArray = ...; // ByteArray to be converted 

MemoryStream ms = new MemoryStream(my); 
BitmapImage bi = new BitmapImage(); 
bi.SetSource(ms); 

Image img = new Image(); 
img.Source = bi; 

Nhưng tôi không thể chuyển đổi các hình ảnh về một byte []! tôi tìm thấy trong Internet một giải pháp, mà làm việc cho WPF:

var bmp = img.Source as BitmapImage; 
int height = bmp.PixelHeight; 
int width = bmp.PixelWidth; 
int stride = width * ((bmp.Format.BitsPerPixel + 7)/8); 

byte[] bits = new byte[height * stride]; 
bmp.CopyPixels(bits, stride, 0); 

Các THƯ VIỆN Silverlight là quá nhỏ bé rằng BitmapImage lớp không có tính chất gọi là Format!

Có ý tưởng nào giải quyết được vấn đề của tôi.

Tôi đã tìm kiếm trên Internet trong một thời gian dài để tìm giải pháp, nhưng không có giải pháp nào hoạt động trong Silverlight!

Cảm ơn!

Trả lời

7

(các bit mỗi phương pháp điểm ảnh bạn đang thiếu chỉ chi tiết như thế nào thông tin màu được lưu trữ trên mỗi pixel)

Như anthony đề nghị, một WriteableBitmap sẽ là cách đơn giản nhất - kiểm tra http://kodierer.blogspot.com/2009/11/convert-encode-and-decode-silverlight.html cho một phương pháp để có được một ARGB mảng byte ra:

public static byte[] ToByteArray(this WriteableBitmap bmp) 
{ 
    // Init buffer 
    int w = bmp.PixelWidth; 
    int h = bmp.PixelHeight; 
    int[] p = bmp.Pixels; 
    int len = p.Length; 
    byte[] result = new byte[4 * w * h]; 

    // Copy pixels to buffer 
    for (int i = 0, j = 0; i < len; i++, j += 4) 
    { 
     int color = p[i]; 
     result[j + 0] = (byte)(color >> 24); // A 
     result[j + 1] = (byte)(color >> 16); // R 
     result[j + 2] = (byte)(color >> 8); // G 
     result[j + 3] = (byte)(color);  // B 
    } 

    return result; 
} 
3

Không có giải pháp nào hoạt động trong Silverlight theo thiết kế. Hình ảnh có thể được truy xuất mà không cần phải tuân thủ bất kỳ chính sách truy cập tên miền chéo nào như các yêu cầu http khác. Cơ sở của việc thư giãn các quy tắc tên miền chéo này là dữ liệu tạo nên hình ảnh không thể được lấy ra trong phần thô. Nó chỉ có thể được sử dụng như một hình ảnh.

Nếu bạn chỉ muốn viết và đọc từ hình ảnh bitmap, hãy sử dụng lớp WriteableBitmap thay vì BitmapImage. Các WriteableBitmap cho thấy một tài sản Pixels không có sẵn trên BitmapImage.

2
public static void Save(this BitmapSource bitmapSource, Stream stream) 
    { 
     var writeableBitmap = new WriteableBitmap(bitmapSource); 

     for (int i = 0; i < writeableBitmap.Pixels.Length; i++) 
     { 
      int pixel = writeableBitmap.Pixels[i]; 

      byte[] bytes = BitConverter.GetBytes(pixel); 
      Array.Reverse(bytes); 

      stream.Write(bytes, 0, bytes.Length); 
     } 
    } 

    public static void Load(this BitmapSource bitmapSource, byte[] bytes) 
    { 
     using (var stream = new MemoryStream(bytes)) 
     { 
      bitmapSource.SetSource(stream); 
     } 
    } 

    public static void Load(this BitmapSource bitmapSource, Stream stream) 
    { 
     bitmapSource.SetSource(stream); 
    } 
+0

Bạn có làm việc này không? Đặc biệt bitmapSource.SetSource (stream); phần? Ném một ngoại lệ cho tôi. – jayarjo