Pergunta

Estou tentando descobrir como usar o FJCORE para codificar um WritEableBitmap para um JPEG. Entendo que o WritEableBitmap fornece os pixels brutos, mas não tenho certeza de como convertê -lo no formato que o FJCORE espera pelo seu método jpegencoder. O JPEGENCODER tem duas sobrecargas, uma toma um fluxjpeg.core.image e o outro toma um decodedjpeg.

Eu estava tentando criar um fluxjpeg.core.image, mas espera um byte [] [,] para os dados da imagem. byte [n] [x, y] onde x é largura e y é altura, mas eu não sei o que N deveria ser.

Eu pensei que N deveria ser 4, pois isso corresponderia às informações do ARGB codificadas em cada pixel, mas quando eu tentei, o FJCORE apresenta um argumento fora da exceção do alcance. Aqui está o que eu tentei. Raster é o meu byte [4] [x, y] matriz.

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);
Foi útil?

Solução

Descobriu! Eu baixei Fjcore de code.google.com e passou pela classe de imagem. Ele espera apenas os bytes RGB. Aqui está a função que escrevi. Eu preciso da versão Base64 da imagem, para que minha função retorne.

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

Outras dicas

Este código está bem e deve funcionar. Estou usando o mesmo código para enviar o fluxo de imagens para o servidor por meio de serviço da web e regenerar a imagem usando esses bytes ... você pode salvar esses bytes em db também

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

Parece que [n] deve ser a matriz de bytes da imagem, eu tenho procurado codificar o WriteableBitmap em um JPEG e encontrei a mesma biblioteca, mas não o procurei em detalhes, mas assumirá que esse seria o caso, adicionará mais Mais tarde, para esta resposta para ver se isso funciona, pois ainda não tenho a chance de experimentá -la. Haverá algum método para obter os bytes de um writitableBitmap no Silverlight, eu acho, pois é possível economizar em outros tipos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top