Silverlight中,把WriteableBitmap转为Byte流并保存到本地

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

ContractedBlock.gif ExpandedBlockStart.gif Code
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[]数组?

ContractedBlock.gif ExpandedBlockStart.gif Code
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文件夹下

代码

转载于:https://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、付费专栏及课程。

余额充值