---恢复内容开始---
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();
时间: 2024-10-20 09:23:42