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();
  • 相关阅读:
    使用Enablebuffering多次读取Asp Net Core 请求体
    Windows Forms和WPF在Net Core 3.0框架下并不会支持跨平台
    .Net Core IIS下无Log4Net日志输出,命令行下却有(dotnet运行)
    ElasticSearch7.x Bool查询Java API
    ElasticSearch7.X Java client
    Spark RDD转DataFrame
    spark写mysql
    spark读取mysql
    Spark2.x写Hbase1-2.x
    Spark2.x读Hbase1-2.x
  • 原文地址:https://www.cnblogs.com/T-ARF/p/6216276.html
Copyright © 2011-2022 走看看