使用FJCore对Silverlight WriteableBitmap进行编码

5
我正在尝试使用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);
3个回答

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

希望你不介意,我使用了你的代码示例,并将其扩展为一篇完整的文章,请参见:http://blog.blueboxes.co.uk/2009/07/21/rendering-xaml-to-a-jpeg-using-silverlight-3/ ,并在CC许可下正确地归属于你。 - John
没问题。很高兴有人从中受益。 - RHLopez

2

这段代码没问题,应该能正常工作。我正在使用相同的代码通过 Web 服务将图像流发送到服务器,然后使用这些字节重新生成图像...你也可以将这些字节保存到数据库中。

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

0
听起来[n]应该是图像的字节数组,我一直在研究如何将WriteableBitmap编码为JPEG,并发现了同样的库,但还没有详细研究过,但我想这应该是可以的,稍后会添加更多内容到这个答案,看看是否有效,因为我还没有机会尝试它。我想在Silverlight中有一些方法可以获取WritableBitmap的字节,因为可以保存为其他类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接