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();
原文地址:https://www.cnblogs.com/T-ARF/p/6216276.html