使用FJCore编码Silverlight WriteableBitmap

RHL*_*pez 5 silverlight writeablebitmap fjcore

我试图找出如何使用FJCore将WriteableBitmap编码为jpeg.我知道WriteableBitmap提供了原始像素,但我不知道如何将其转换为FJCore对其JpegEncoder方法所期望的格式.JpegEncoder有两个重载,一个采用FluxJpeg.Core.Image,另一个采用DecodedJpeg.

我试图创建一个FluxJpeg.Core.Image,但它需要一个byte [] [,]用于图像数据.byte [n] [x,y]其中x是宽度,y是高度,但我不知道n应该是什么.

我认为n应该是4,因为那将对应于每个像素中编码的argb信息,但是当我尝试FJCore抛出一个超出范围异常的参数时.这是我试过的.Raster是我的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);
Run Code Online (Sandbox Code Playgroud)

RHL*_*pez 13

弄清楚了!我从code.google.com下载了FJCore,然后浏览了图像类.它只需要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;
    }
Run Code Online (Sandbox Code Playgroud)