2009-07-16 20 views
5

Tôi đang cố gắng tìm hiểu cách sử dụng FJCore để mã hóa WriteableBitmap thành jpeg. Tôi hiểu rằng WriteableBitmap cung cấp các pixel thô nhưng tôi không chắc chắn cách chuyển đổi nó thành định dạng mà FJCore mong đợi cho phương thức JpegEncoder của nó. JpegEncoder có hai quá tải, một mất một FluxJpeg.Core.Image và khác mất trong một DecodedJpeg.Sử dụng FJCore để mã hóa Silverlight WriteableBitmap

Tôi đã cố gắng tạo FluxJpeg.Core.Image nhưng dự kiến ​​một byte [] [,] cho dữ liệu hình ảnh. byte [n] [x, y] trong đó x là chiều rộng và y là chiều cao nhưng tôi không biết n là gì.

Tôi nghĩ rằng n phải là 4 vì nó sẽ tương ứng với thông tin argb được mã hóa trong mỗi pixel nhưng khi tôi thử rằng FJCore ném một đối số ra khỏi phạm vi ngoại lệ. Đây là những gì tôi đã thử. Raster là mảng byte [4] [x, y] của tôi.

raster[0][x, y] = (byte)((pixel >> 24) & 0xFF); 
raster[1][x, y] = (byte)((pixel >> 16) & 0xFF); 
raster[2][x, y] = (byte)((pixel >> 8) & 0xFF); 
raster[3][x, y] = (byte)(pixel & 0xFF); 

Trả lời

13

Đã tìm ra! Tôi đã tải xuống FJCore from code.google.com và đã trải qua lớp hình ảnh. Nó chỉ hy vọng các byte RGB. Đây là chức năng mà tôi đã viết. Tôi cần phiên bản base64 của hình ảnh vì vậy đó là những gì chức năng của tôi trả về.

private static string GetBase64Jpg(WriteableBitmap bitmap) 
    { 
     int width = bitmap.PixelWidth; 
     int height = bitmap.PixelHeight; 
     int bands = 3; 
     byte[][,] raster = new byte[bands][,]; 

     for (int i = 0; i < bands; i++) 
     { 
      raster[i] = new byte[width, height];  
     } 

     for (int row = 0; row < height; row++) 
     { 
      for (int column = 0; column < width; column++) 
      { 
       int pixel = bitmap.Pixels[width * row + column]; 
       raster[0][column, row] = (byte)(pixel >> 16); 
       raster[1][column, row] = (byte)(pixel >> 8); 
       raster[2][column, row] = (byte)pixel; 
      } 
     } 

     ColorModel model = new ColorModel { colorspace = ColorSpace.RGB }; 
     FluxJpeg.Core.Image img = new FluxJpeg.Core.Image(model, raster); 
     MemoryStream stream = new MemoryStream(); 
     JpegEncoder encoder = new JpegEncoder(img, 90, stream); 
     encoder.Encode(); 

     stream.Seek(0, SeekOrigin.Begin); 
     byte[] binaryData = new Byte[stream.Length]; 
     long bytesRead = stream.Read(binaryData, 0, (int)stream.Length); 

     string base64String = 
       System.Convert.ToBase64String(binaryData, 
               0, 
               binaryData.Length); 

     return base64String; 
    } 
+0

Hy vọng bạn không nhớ nhưng tôi đã sử dụng mã của bạn mẫu và mở rộng nó vào một bài viết đầy đủ, xem: http://blog.blueboxes.co.uk/2009/07/21/rendering-xaml-to-a-jpeg-using-silverlight-3/ và cho bạn biết chính xác là theo giấy phép CC – John

+0

Không sao. Vui mừng một người nào đó được hưởng lợi từ việc này. – RHLopez

0

Âm thanh như [n] nên là byte-mảng của hình ảnh, tôi đã nhìn vào mã hóa WriteableBitmap thành một JPEG và tìm thấy cùng một thư viện nhưng đã không nhìn vào nó một cách chi tiết, nhưng giả thiết này sẽ là trường hợp, sẽ thêm nhiều hơn sau này để trả lời này để xem nếu điều này hoạt động, như tôi đã không có cơ hội để thử nó được nêu ra. Sẽ có một số phương thức để nhận các byte của một WritableBitmap trong Silverlight mà tôi đoán là có thể lưu vào các kiểu khác.

2

Mã này là tốt và nó sẽ hoạt động. Tôi đang sử dụng cùng một mã để gửi dòng hình ảnh đến máy chủ thông qua dịch vụ web và hơn tái tạo hình ảnh sử dụng các byte ... bạn có thể lưu các byte để Db cũng

[WebMethod] 
public string SaveImage(string data, string fileName) 
{ 
    byte[] imageBytes = System.Convert.FromBase64String(data); 

    MemoryStream mem = new MemoryStream(); 
    mem.Write(imageBytes, 0, imageBytes.Length); 

    System.Drawing.Image img = System.Drawing.Image.FromStream(mem); 
    img.Save("D:\\FinalTest.jpg");  
    return "Saved !"; 
} 
Các vấn đề liên quan