微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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, 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐