2009-07-16 10 views
5

Sto cercando di scoprire come utilizzare FJCore per codificare un WriteableBitmap in un file jpeg. Capisco che WriteableBitmap fornisce i pixel grezzi ma non sono sicuro di come convertirlo nel formato che FJCore si aspetta per il suo metodo JpegEncoder. JpegEncoder ha due overload, uno prende un FluxJpeg.Core.Image e l'altro prende un DecodedJpeg.Utilizzo di FJCore per la codifica di Silverlight WriteableBitmap

Stavo cercando di creare un FluxJpeg.Core.Image ma si aspetta un byte [] [,] per i dati dell'immagine. byte [n] [x, y] dove x è width e y è height ma non so quale n dovrebbe essere.

Ho pensato che n dovrebbe essere 4 dato che corrisponderebbe alle informazioni argb codificate in ciascun pixel ma quando ho provato che FJCore genera un argomento fuori dall'eccezione di intervallo. Ecco cosa ho provato. Raster è il mio byte [4] [x, y] array.

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

risposta

13

Capito! Ho scaricato FJCore from code.google.com e ho esaminato la classe dell'immagine. Si aspetta solo i byte RGB. Ecco la funzione che ho scritto. Ho bisogno della versione base64 dell'immagine, ecco cosa restituisce la mia funzione.

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

Spero che non ti dispiaccia, ma ho usato il tuo codice campionare ed estenderlo a un articolo completo vedi: http://blog.blueboxes.co.uk/2009/07/21/rendering-xaml-to-a-jpeg-using-silverlight-3/ e ti attribuisci correttamente come sotto la licenza CC – John

+0

Nessun problema. Sono contento che qualcuno stia beneficiando di questo. – RHLopez

0

Suona come [n] dovrebbe essere il byte-array dell'immagine, ho cercato in codifica WriteableBitmap in JPEG ed ho trovato la stessa libreria, ma non ho guardato in esso in dettaglio, ma presuppongo che questo sarebbe sii il caso, aggiungerò più tardi a questa risposta per vedere se funziona, dato che non ho ancora avuto la possibilità di provarlo. Ci sarà un metodo per ottenere i byte di un WritableBitmap in Silverlight, immagino come è possibile salvare in altri tipi.

2

Questo codice va bene e dovrebbe funzionare. Sto usando lo stesso codice per inviare flusso di immagini al server tramite web service e di rigenerare immagine utilizzando questi byte ... è possibile salvare questi byte di Db anche

[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 !"; 
} 
Problemi correlati