2009-07-16 11 views
5

Próbuję dowiedzieć się, jak używać FJCore do kodowania WriteableBitmap do jpeg. Rozumiem, że WriteableBitmap udostępnia nieprzetworzone piksele, ale nie jestem pewien, jak przekonwertować ten format do formatu oczekiwanego przez FJCore dla jego metody JpegEncoder. JpegEncoder ma dwa przeciążenia, jeden pobiera FluxJpeg.Core.Image, a drugi przyjmuje DecodedJpeg.Używanie FJCore do kodowania Silverlight WriteableBitmap

Próbowałem stworzyć FluxJpeg.Core.Image, ale spodziewa się bajt [] [,] dla danych obrazu. bajt [n] [x, y] gdzie x to szerokość, a y to wysokość, ale nie wiem, jaki powinien być n.

Pomyślałem, że n powinno być 4, ponieważ odpowiadałoby to informacjom argb zakodowanym w każdym pikselu, ale gdy spróbowałem, FJCore wyrzucił argument poza zakresem wyjątku. Oto, co próbowałem. Raster to tablica bajtów [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); 

Odpowiedz

13

Wyliczyłem to! Pobrałem FJCore from code.google.com i przeszedłem przez klasę obrazów. Oczekuje tylko bajtów RGB. Oto funkcja, którą napisałem. Potrzebuję wersji base64 obrazu, więc to jest to, co zwraca moja funkcja.

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

nadzieję, że nie przeszkadza ale użyłem kodu próbka i rozszerzenie go do pełnego artykułu zobacz: http://blog.blueboxes.co.uk/2009/07/21/rendering-xaml-to-a-jpeg-using-silverlight-3/ i przypisano ci poprawnie jako na licencji CC – John

+0

Bez problemu. Cieszę się, że ktoś z tego korzysta. – RHLopez

0

Wygląda na to, [n], jest bajt macierz obrazu, to zostały patrząc kodowania WriteableBitmap w formacie JPEG i stwierdzono tej samej biblioteki, ale nie spojrzał w szczegółach, ale zakładać byłoby w tym przypadku, dodam później tę odpowiedź, aby sprawdzić, czy to działa, ponieważ nie mam jeszcze okazji jej wypróbować. Będzie jakiś sposób na pobranie bajtów z WritableBitmap w Silverlight, jak sądzę, ponieważ możliwe jest zapisanie na inne typy.

2

Ten kod jest w porządku i powinien działać. Używam tego samego kodu do wysyłania strumienia obrazu do serwera za pośrednictwem usługi internetowej i zregenerować obraz niż przy użyciu tych bajtów ... można zapisać te bajty do Db także

[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 !"; 
} 
Powiązane problemy