2009-12-05 22 views
6

Tôi đang cố gắng chuyển một số hình ảnh của hình ảnh qua lại giữa Silverlight và dịch vụ WCF. Nếu có thể, tôi muốn chuyển số System.Windows.Media.Imaging.BitmapImage, vì điều đó có nghĩa là khách hàng không phải thực hiện bất kỳ chuyển đổi nào.Tôi có thể lấy một byte [] từ một BitmapImage trong Silverlight không?

Tuy nhiên, tại một thời điểm nào đó, tôi cần lưu trữ hình ảnh này trong cơ sở dữ liệu, có nghĩa là đại diện hình ảnh phải có khả năng chuyển đổi thành và từ byte[]. Tôi có thể tạo ra một BitmapImage từ một byte[] bằng cách đọc mảng thành một MemoryStream và sử dụng BitmapImage.SetSource(). Nhưng tôi dường như không thể tìm cách chuyển đổi theo cách khác - từ BitmapImage thành byte[]. Tôi có thiếu thứ gì đó hiển nhiên ở đây không?

Nếu nó giúp ích chút nào, mã chuyển đổi có thể chạy trên máy chủ, nghĩa là mã không cần phải an toàn với Silverlight.

+0

Bạn đã bao giờ nhận được một giải pháp cho việc này? –

+0

No. Hình ảnh ban đầu được tải qua người dùng chọn nó trong hộp thoại Mở. Cách giải quyết là truy cập openDialog.File.OpenRead, tạo BinaryReader từ luồng đó, sau đó gọi ReadBytes() trên đầu đọc để nhận byte []. Tôi đã không theo kịp với Silverlight 4, có thể có một giải pháp có sẵn ngay bây giờ. – goric

Trả lời

6

Sử dụng này:

public byte[] GetBytes(BitmapImage bi) 
{ 
    WriteableBitmap wbm = new WriteableBitmap(bi); 
    return wbm.ToByteArray(); 
} 

đâu

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

Thử sử dụng CopyPixels. Bạn có thể sao chép dữ liệu bitmap vào một mảng byte. Tuy nhiên, tôi thành thật không chắc chắn định dạng của các điểm ảnh sẽ là ... nó có thể phụ thuộc vào loại hình ảnh ban đầu được tải.

+0

Trang bạn đã liên kết là dành cho .NET nói chung, phiên bản Silverlight của BitmapSource (trong System.Windows.dll) không hỗ trợ phương thức này: http://msdn.microsoft.com/en-us/library/system .windows.media.imaging.bitmapsource% 28VS.95% 29.aspx – goric

+0

Ồ, xin lỗi. Tôi quên rằng Silverlight và WPF không hoàn toàn bằng nhau. – jrista

1

tôi đã cùng một vấn đề. Tôi đã tìm thấy số ImageTools library giúp cho công việc dễ dàng hơn.

Nhận thư viện và tham khảo nó và sau đó

     using (var writingStream = new MemoryStream()) 
         { 
          var encoder = new PngEncoder 
          { 
           IsWritingUncompressed = false 
          }; 
          encoder.Encode(bitmapImageInstance, writingStream); 
          // do something with the array 
         } 
Các vấn đề liên quan