2009-07-16 59 views
5

我想了解如何使用FJCore將WriteableBitmap編碼爲jpeg。我知道WriteableBitmap提供了原始像素,但我不確定如何將其轉換爲FJCore對其JpegEncoder方法的預期格式。 JpegEncoder有兩個重載,一個需要一個FluxJpeg.Core.Image,另一個需要一個DecodedJpeg。使用FJCore編碼Silverlight WriteableBitmap

我試圖創建一個FluxJpeg.Core.Image,但它需要一個字節[] [,]作爲圖像數據。 byte [n] [x,y]其中x是寬度,y是高度,但我不知道應該是什麼n。

我認爲n應該是4,因爲那將對應於在每個像素中編碼的argb信息,但是當我嘗試FJCore拋出一個參數超出範圍異常。這是我試過的。柵格是我的byte [4] [x,y]數組。

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

回答

13

想通了!我下載了FJCore from code.google.com並通過了圖像課。它只需要RGB字節。這是我寫的功能。我需要base64版本的圖像,這就是我的函數返回的。

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

希望你不介意,但我用你的代碼並將其擴展爲完整的文章,請參閱:http://blog.blueboxes.co.uk/2009/07/21/rendering-xaml-to-a-jpeg-using-silverlight-3/,並將您正確歸因於根據CC許可證 – John 2009-07-21 19:53:32

0

聽起來[n]的應該是圖像的字節數組,我一直在尋找到編碼WriteableBitmap的成JPEG,發現相同的庫,但還沒有研究它的細節,但假設這將如果是這樣,稍後會在此答案中添加更多內容,看看這是否有效,因爲我還沒有機會嘗試它。我猜測會有一些方法來獲取Silverlight中的WritableBitmap的字節,因爲可以將其保存爲其他類型。

2

此代碼是好的,它應該工作。我使用相同的代碼來通過Web服務的圖像流發送到服務器,也比使用這些字節再生圖像......你可以將這些字節保存到數據庫也

[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 !"; 
} 
相關問題