Pregunta

Estoy tratando de encontrar la manera de utilizar FJCore para codificar un WriteableBitmap a un jpeg. Entiendo que WriteableBitmap ofrece los píxeles primas, pero no estoy seguro de cómo convertirlo al formato que FJCore espera para su método JpegEncoder. JpegEncoder tiene dos sobrecargas, se toma una FluxJpeg.Core.Image y el otro toma en un DecodedJpeg.

Yo estaba tratando de crear un FluxJpeg.Core.Image pero espera un byte [] [,] para los datos de imagen. byte [n] [x, y], donde x es la anchura y la altura y es, pero no sé lo que debería ser n.

pensé que n debe ser de 4, ya que correspondería a la información codificada ARGB en cada píxel, pero cuando traté de que FJCore lanza un argumento de excepción gama. Esto es lo que he intentado. Raster es mi 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);
¿Fue útil?

Solución

lo descubrió! He descargado FJCore de code.google.com y pasó por la clase de imagen. Sólo se espera que los bytes RGB. Esta es la función que escribí. Necesito la versión base 64 de la imagen y eso es lo devuelve mi función.

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

Otros consejos

Este código está muy bien y que debería funcionar. Estoy usando mismo código para enviar secuencia de imágenes a través del servidor de servicios web y de regenerar la imagen utilizando estos bytes ... puede guardar estos bytes a Db también

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

Suena como [n] debe ser la matriz de bytes de la imagen, he estado buscando en la codificación WriteableBitmap en un JPEG y encontró la misma biblioteca, pero no han estudiado en detalle, pero asumen que este sería el caso, va a añadir más tarde a esta respuesta para ver si esto funciona, ya que no he tener la oportunidad de probarlo todavía. Habrá algún método para obtener los bytes de un WritableBitmap en Silverlight, supongo, ya que es posible salvar a otros tipos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top