Silverlight中实现WriteableBitmap转为Byte流

 

  • 本文将介绍的是Silverlight中,把WriteableBitmap转为Byte流并保存到本地,希望对大家有所帮助。
  •  

    在银光Silverlight中,对于WriteableBitmap是本文的重点。这里将为大家讲解具体的实现过程,希望能对今后的开发工作有所帮助。

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

       
       
    1. Code  
    2. private void ButtonSave_Click(object sender, RoutedEventArgs e)  
    3.         {  
    4.             WriteableBitmap bitmap = new WriteableBitmap(MyStackPanel, null);  
    5.  
    6.             if (bitmap != null)  
    7.             {  
    8.                 SaveFileDialog saveDlg = new SaveFileDialog();  
    9.                 saveDlg.Filter = "JPEG Files (*.jpeg)|*.jpeg";  
    10.                 saveDlg.DefaultExt = ".jpeg";  
    11.  
    12.                 if ((bool)saveDlg.ShowDialog())  
    13.                 {  
    14.                     using (Stream fs = saveDlg.OpenFile())  
    15.                     {  
    16.                         SaveToFile(bitmap, fs);  
    17.                         MessageBox.Show("File save Complete");  
    18.                     }  
    19.                 }  
    20.             }  
    21.         }  
    22.  
    23.         private static void SaveToFile(WriteableBitmap bitmap, Stream fs)  
    24.         {  
    25.             int width = bitmap.PixelWidth;  
    26.             int height = bitmap.PixelHeight;  
    27.             int bands = 3;  
    28.             byte[][,] raster = new byte[bands][,];  
    29.  
    30.             for (int i = 0; i < bands; i++)  
    31.             {  
    32.                 raster[i] = new byte[width, height];  
    33.             }  
    34.  
    35.             for (int row = 0; row < height; row++)  
    36.             {  
    37.                 for (int column = 0; column < width; column++)  
    38.                 {  
    39.                     int pixel = bitmap.Pixels[width * row + column];  
    40.                     raster[0][column, row] = (byte)(pixel >> 16);  
    41.                     raster[1][column, row] = (byte)(pixel >> 8);  
    42.                     raster[2][column, row] = (byte)pixel;  
    43.                 }  
    44.  
    45.             }  
    46.  
    47.             FluxJpeg.Core.ColorModel model = new FluxJpeg.Core.ColorModel { colorspace = FluxJpeg.Core.ColorSpace.RGB };  
    48.             FluxJpeg.Core.Image img = new FluxJpeg.Core.Image(model, raster);  
    49.  
    50.  
    51.             //Encode the Image as a JPEG  
    52.             MemoryStream stream = new MemoryStream();  
    53.             FluxJpeg.Core.Encoder.JpegEncoder encoder = new FluxJpeg.Core.Encoder.JpegEncoder(img, 100, stream);  
    54.             encoder.Encode();  
    55.  
    56.             //Back to the start  
    57.             stream.Seek(0, SeekOrigin.Begin);  
    58.  
    59.             //Get teh Bytes and write them to the stream  
    60.             byte[] binaryData = new Byte[stream.Length];  
    61.             long bytesRead = stream.Read(binaryData, 0, (int)stream.Length);  
    62.             fs.Write(binaryData, 0, binaryData.Length);  
    63.         } 

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

       
       
    1. Code  
    2. for (int row = 0; row < height; row++)  
    3.             {  
    4.                 for (int column = 0; column < width; column++)  
    5.                 {  
    6.                     int pixel = bitmap.Pixels[width * row + column];  
    7.                     raster[0][column, row] = (byte)(pixel >> 16);  
    8.                     raster[1][column, row] = (byte)(pixel >> 8);  
    9.                     raster[2][column, row] = (byte)pixel;  
    10.                 }  
    11.  
    12.             } 

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

    原文标题:Silverlight中,把WriteableBitmap转为Byte流并保存到本地

    链接:http://www.cnblogs.com/zhangxuguang2007/archive/2009/11/05/1596721.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值