龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

Silverlight编程把WriteableBitmap转为Byte流并保存到本地的方法

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
Silverlight中,把WriteableBitmap转为Byte流并保存到本地的算法核心:对WriteableBitmap的所有像素点做循环遍历,然后存入Byte[]数组中,再转换为MemoryStream输出,下面是代码 C# Code [http://www.xue

Silverlight中,把WriteableBitmap转为Byte流并保存到本地的算法核心:对WriteableBitmap的所有像素点做循环遍历,然后存入Byte[]数组中,再转换为MemoryStream输出,下面是代码

C# Code [http://www.xueit.com]
private void ButtonSave_Click(object sender, RoutedEventArgs e)
{
    WriteableBitmap bitmap = new WriteableBitmap(MyStackPanel, null);

    if (bitmap != null)
    {
        SaveFileDialog saveDlg = new SaveFileDialog();
        saveDlg.Filter = "JPEG Files (*.jpeg)|*.jpeg";
        saveDlg.DefaultExt = ".jpeg";

        if ((bool)saveDlg.ShowDialog())
        {
            using (Stream fs = saveDlg.OpenFile())
            {
                SaveToFile(bitmap, fs);
                MessageBox.Show("File save Complete");
            }
        }
    }
}

private static void SaveToFile(WriteableBitmap bitmap, Stream fs)
{
    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;
        }

    }

    FluxJpeg.Core.ColorModel model = new FluxJpeg.Core.ColorModel { colorspace = FluxJpeg.Core.ColorSpace.RGB };
    FluxJpeg.Core.Image img = new FluxJpeg.Core.Image(model, raster);


    //Encode the Image as a JPEG
    MemoryStream stream = new MemoryStream();
    FluxJpeg.Core.Encoder.JpegEncoder encoder = new FluxJpeg.Core.Encoder.JpegEncoder(img, 100, stream);
    encoder.Encode();

    //Back to the start
    stream.Seek(0, SeekOrigin.Begin);

    //Get teh Bytes and write them to the stream
    byte[] binaryData = new Byte[stream.Length];
    long bytesRead = stream.Read(binaryData, 0, (int)stream.Length);
    fs.Write(binaryData, 0, binaryData.Length);
}

我对其中的这一段尤其不满意,自觉是性能的关键,有没有更高效的算法快速从WriteableBitmap直接得到像素的Byte[]数组?
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;
 }

}
下面为演示代码,需要引入FJCore,如果您再编译的时候发现路径不正确,请出新引入一下,我已经那个把FJCoer放置在了压缩包中的refer文件夹下.

代码下载

精彩图集

赞助商链接