zoukankan      html  css  js  c++  java
  • UWP&WP8.1 重新绘制图片 WriteableBitmap用法 图片转byte[]数组,byte[]数组转图片

    ---恢复内容开始---

    WriteableBitmap 是UWP和WP8.1绘制图片的,重组图片的最重要方法。方法较为简单,方法多样性。

    通过查看文档,WriteableBitmap的继承性是   WriteableBitmap : BitmapSource 【BitmapSource : ImageSource】,也就是说WB【WriteableBitmap下文简称】可以直接赋值给Image控件的Source。

    用法介绍:

    WriteableBitmap WB=new WriteableBitmap(300,300) //这个地方是,宽度,长度。int类型.  

    方法1SetSourceAsync()

    这个方法就是,使用文件的openAsync流就可以了。

     StorageFile file = await StorageFile.GetFileFromPathAsync(filePath);
                await  wb.SetSourceAsync(await  file.OpenAsync(FileAccessMode.ReadWrite));

    方法2 PixelBuffer.AsStream().

    写入 字节数组,这个方法最为常用。

    具体方式是 将 数组通过stream流写入其中。

                using (Stream _stream = wb.PixelBuffer.AsStream())
                {
                    await _stream.WriteAsync(buffer, 0, buffer.Length);
                }

    当你完成以上这些步骤之后就是的最后一步就是重绘整个图片。也就是 wb.Invalidate();之后你就直接赋值给Image控件的Source就可以了。

    说个要点:

    如果你有数组,想重绘图片的时候,新建WB的时候,长宽一定要和图片的长宽一样,或者和展示图片的控件一样长宽。不然会出现花屏,字节长出范围等错误。

    如果是绑定的图片,你不要直接用wb,你先新建一个ImageSource,之后 赋值于WB,在用这个ImageSource给其绑定就可以了

    获取图片的数组的方法:

    首先是打开文件,应用内已知的文件。

     StorageFile imageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///PPAP.jpg", UriKind.Absolute));
                IRandomAccessStream accStream  = await imageFile.OpenAsync(FileAccessMode.Read);
                BitmapDecoder bd = await BitmapDecoder.CreateAsync(accStream);
    ///获取数据         
                var imageData = await bd.GetPixelDataAsync();//
                //获取二维数组
           byte[]    buffer = imageData.DetachPixelData();

    还有一种方法,也是同样

       RandomAccessStreamReference ras = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///PPAP.jpg", UriKind.Absolute));
                var files = await ras.OpenReadAsync();
                                                                  //解码器
                BitmapDecoder bd = await BitmapDecoder.CreateAsync(files.CloneStream()); 
    //两种获取数据的方法 // buffer = new byte[(int)streamToRead.Length]; // streamToRead.Read(buffer, 0, (int)streamToRead.Length); // await streamToRead.ReadAsync(buffer, 0, (int)streamToRead.Length); //BitmapTransform transform = new BitmapTransform() //压缩或者放大到与WriteableBitmap长宽一致 // //或者等于显示图片的容器大小 //{ // ScaledHeight = 160, // wb.PixelHeight; // ScaledWidth = 120, // wb.PixelWidth; //}; // var imageData = await bd.GetPixelDataAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, transform, ExifOrientationMode.IgnoreExifOrientation, ColorManagementMode.DoNotColorManage); ///获取数据 var imageData = await bd.GetPixelDataAsync();// //获取二维数组 byte[] buffer = imageData.DetachPixelData();
  • 相关阅读:
    PHP thinkPHP6.0 部署
    ch09 Sql导入语句
    自定义map 搜索
    MySql 语句
    自定义Mappter
    三袋米的故事
    WPF中实现文件夹对话框(OpenFileDialog in WPF)
    web通过Ajax与WCF交互
    项目管理之我见-程序员程序开发步骤
    存储过程
  • 原文地址:https://www.cnblogs.com/T-ARF/p/6216276.html
Copyright © 2011-2022 走看看