title author date CreateTime categories
win10 uwp 读取保存WriteableBitmap 、BitmapImage
lindexi
2018-08-10 19:16:51 +0800
2018-2-13 17:23:3 +0800
Win10 UWP

我们在UWP,经常使用的图片,数据结构就是 BitmapImage 和 WriteableBitmap。关于 BitmapImage 和 WriteableBitmap 区别,我就不在这里说。主要说的是 BitmapImage 和 WriteableBitmap 、二进制 byte 的互转。

我们先写一个简单的xaml

       <Image x:Name="Img" Height="200" Width="200" HorizontalAlignment="Center" Source="Assets/SplashScreen.png" ></Image><Button Margin="10,300,10,10" Content="确定" Click="Button_OnClick" ></Button>

用到的图片是我新建自带的。

保存 WriteableBitmap 到文件

    private static async Task SaveWriteableBitmapImageFile(WriteableBitmap image, StorageFile file){//BitmapEncoder 存放格式Guid bitmapEncoderGuid = BitmapEncoder.JpegEncoderId;string filename = file.Name;if (filename.EndsWith("jpg")){bitmapEncoderGuid = BitmapEncoder.JpegEncoderId;}else if (filename.EndsWith("png")){bitmapEncoderGuid = BitmapEncoder.PngEncoderId;}else if (filename.EndsWith("bmp")){bitmapEncoderGuid = BitmapEncoder.BmpEncoderId;}else if (filename.EndsWith("tiff")){bitmapEncoderGuid = BitmapEncoder.TiffEncoderId;}else if (filename.EndsWith("gif")){bitmapEncoderGuid = BitmapEncoder.GifEncoderId;}using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite, StorageOpenOptions.None)){BitmapEncoder encoder = await BitmapEncoder.CreateAsync(bitmapEncoderGuid, stream);Stream pixelStream = image.PixelBuffer.AsStream();byte[] pixels = new byte[pixelStream.Length];await pixelStream.ReadAsync(pixels, 0, pixels.Length);encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore,(uint)image.PixelWidth,(uint)image.PixelHeight,96.0,96.0,pixels);//Windows.Graphics.Imaging.BitmapDecoder decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(imgstream);//Windows.Graphics.Imaging.PixelDataProvider pxprd = await decoder.GetPixelDataAsync(Windows.Graphics.Imaging.BitmapPixelFormat.Bgra8, Windows.Graphics.Imaging.BitmapAlphaMode.Straight, new Windows.Graphics.Imaging.BitmapTransform(), Windows.Graphics.Imaging.ExifOrientationMode.RespectExifOrientation, Windows.Graphics.Imaging.ColorManagementMode.DoNotColorManage);await encoder.FlushAsync();}}

从文件读 WriteableBitmap

        private static async Task<WriteableBitmap> OpenWriteableBitmapFile(StorageFile file){using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read)){BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);WriteableBitmap image = new WriteableBitmap((int)decoder.PixelWidth, (int)decoder.PixelHeight);image.SetSource(stream);return image;}}

ImageSource 转byte[]

ImageSource可以是 BitmapImage 、WriteableBitmap,如果是WriteableBitmap ,那么直接转换

WriteableBitmap 转byte[]

bitmap.PixelBuffer.ToArray();

Image 转byte[]

如果我们的 ImageSource 是 BitmapImage ,那么我们不能使用上面的办法,直接保存 WriteableBitmap ,我们可以使用截图

private async Task<string> ToBase64(Image control)
{var bitmap = new RenderTargetBitmap();await bitmap.RenderAsync(control);return await ToBase64(bitmap);
}

如果 ImageSource 是 WriteableBitmap ,直接保存

我们使用 byte[] 在传输时不好,不能用在 http 传输上(不是一定的不能),所以我们就把它转为base64,我提供了很多方法把数组转 base64 ,把文件转为 base64 。代码是 https://codepaste.net/ijx28i 抄的。

//WriteableBitmap 转 byte[]
private async Task<string> ToBase64(WriteableBitmap bitmap)
{var bytes = bitmap.PixelBuffer.ToArray();return await ToBase64(bytes, (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight);
}private async Task<string> ToBase64(StorageFile bitmap)
{var stream = await bitmap.OpenAsync(Windows.Storage.FileAccessMode.Read);var decoder = await BitmapDecoder.CreateAsync(stream);var pixels = await decoder.GetPixelDataAsync();var bytes = pixels.DetachPixelData();return await ToBase64(bytes, (uint)decoder.PixelWidth, (uint)decoder.PixelHeight, decoder.DpiX, decoder.DpiY);
}private async Task<string> ToBase64(RenderTargetBitmap bitmap)
{var bytes = (await bitmap.GetPixelsAsync()).ToArray();return await ToBase64(bytes, (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight);
}private async Task<string> ToBase64(byte[] image, uint height, uint width, double dpiX = 96, double dpiY = 96)
{// encode imagevar encoded = new InMemoryRandomAccessStream();var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, encoded);encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, height, width, dpiX, dpiY, image);await encoder.FlushAsync();encoded.Seek(0);// read bytesvar bytes = new byte[encoded.Size];await encoded.AsStream().ReadAsync(bytes, 0, bytes.Length);// create base64return Convert.ToBase64String(bytes);
}private async Task<ImageSource> FromBase64(string base64)
{// read streamvar bytes = Convert.FromBase64String(base64);var image = bytes.AsBuffer().AsStream().AsRandomAccessStream();// decode imagevar decoder = await BitmapDecoder.CreateAsync(image);image.Seek(0);// create bitmapvar output = new WriteableBitmap((int)decoder.PixelHeight, (int)decoder.PixelWidth);await output.SetSourceAsync(image);return output;
}

上面代码出处:https://codepaste.net/ijx28i

从文件读 BitmapImage

        private async Task<BitmapImage> OpenBitmapImageFile(StorageFile file){var fileStream = await file.OpenReadAsync();var bitmap = new BitmapImage();await bitmap.SetSourceAsync(fileStream);return bitmap;}

BitmapImage 转 WriteableBitmap

我使用http://www.cnblogs.com/cjw1115/p/5164327.html 大神的,直接转WriteableBitmap bitmap = imageSource as WriteableBitmap;bitmap为null,于是我在网上继续找,好像没看到 UWP 的可以转,只有win7的

其实大神有说,Image的 Source是 WriteableBitmap ,于是他就能转。

UWP的 BitmapImage 不能转换为 byte[] 或 WriteableBitmap 。这句话是错的。


2017年1月4日21:45:37


我后来过了几个月,发现我们的 BitmapImage 可以转 byte[]

我们可以通过拿 BitmapImage 的 UriSource 把它转为 WriteableBitmap ,可以使用截图获得 BitmapImage。

如果想要使用 BitmapImage 的 UriSource 转为 WriteableBitmap,需要 WriteableBitmapEx 。他是在 WPF 就被大家喜欢的库。如何安装 WriteableBitmapEx ,其实有了Nuget 基本没问题。

搜索 WriteableBitmapEx Nuget

然后搜索到了,我们要什么,好像我也不知道。

我就知道可以使用 WriteableBitmap image = await BitmapFactory.New(1, 1).FromContent((BitmapImage).UriSource);

那么转 byte[] 如何做,有了 WriteableBitmap ,下面的我也不知道,不要问我。

如果使用 BitmapImage 图片是 SetSource,那么我也不会。

获取图片中鼠标点击的颜色

获取鼠标点击的那个点,图片的颜色。那么图片之外,界面呢?其实我们还可以把界面截图,然后获取。

那么我们需要首先在 Image 使用 Tap ,假如图片 source 是 BitmapImage

前提安装 WriteableBitmapEx ,假如我们的 ViewModel有一个 BitmapImage 的图片 Image ,于是我们可以使用

            var position = e.GetPosition(sender as UIElement); //鼠标点击的在哪WriteableBitmap image = await BitmapFactory.New(1, 1).FromContent((View.Image).UriSource); //我上面说的如何把 BitmapImage 转 WriteableBitmapExvar temp = image.GetPixel((int) position.X, (int) position.Y);string str = $"R: {temp.R} G: {temp.G} B: {temp.B} ";

获得图片中鼠标点击的颜色。这个方法有时炸了,都是 255 。

代码:https://github.com/lindexi/UWP/tree/master/uwp/src/ImageMoseClick

获取Dpi

可以使用下面代码获取图片DPI。

我的图片从解决方案获得,大家可以从任意的位置获取,只要可以转换为 IRandomAccessStream

var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/lindexi.png"));using (IRandomAccessStream stream = await file.OpenReadAsync()){                BitmapDecoder decoder = await BitmapDecoder.CreateAsync(BitmapDecoder.PngDecoderId, stream); var DpiX = decoder.DpiX;var DpiY = decoder.DpiY;                 }

如果需要保存网络图片到本地,请到win10 uwp 存放网络图片到本地

参见:http://www.cnblogs.com/cjw1115/p/5164327.html

http://www.cnblogs.com/yuanforprogram/p/4819307.html

http://stackoverflow.com/questions/41439543/how-can-i-get-the-pixel-color-of-an-image-at-the-current-pointer-position-in-a-u

http://www.cnblogs.com/mqxs/p/5707620.html

2018-8-10-win10-uwp-读取保存WriteableBitmap-、BitmapImage相关推荐

  1. win10 uwp 入门

    UWP是什么我在这里就不说,本文主要是介绍如何入门UWP,也是合并我写的博客. 关于UWP介绍可以参见:http://lib.csdn.net/article/csharp/32451 首先需要申请一 ...

  2. win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序

    本文是一个非常简单的博客,让大家知道如何使用 asp dot net core 做后台,使用 UWP 或 WPF 等做前台. 本文因为没有什么业务,也不想做管理系统,所以看到起来是很简单. Visua ...

  3. win10 uwp 使用 Microsoft.Graph 发送邮件

    在 2018 年 10 月 13 号参加了 张队长 的 Office 365 训练营 学习如何开发 Office 365 插件和 OAuth 2.0 开发,于是我就使用 UWP 尝试使用 Micros ...

  4. win10 UWP 序列化

    将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. <!--more-- ...

  5. 如何更新微软的html,如何升级微软2018 Windows 10更新四月正式版17134系统?

    微软已经正式发布了2018 Windows 10更新四月版系统,版本号是Build 17134,目前微软提供了多种升级途径,那么,如何升级微软2018 Windows 10更新四月正式版17134系统 ...

  6. win10 UWP Controls by function

    Windows的 XAML UI 框架提供了很多控件,支持用户界面开发库. 我现在做的一个中文版的,很多都是照着微软写,除了注释 我们先学微软做一个简单的frame,新建Page,里面放title和跳 ...

  7. win10 UWP 剪贴板 Clipboard

    本文告诉大家如何使用剪贴板 Clipboard 读取剪贴板和放内容在剪贴板 在 win10 UWP 可以通过 Windows.ApplicationModel.DataTransfer.Clipboa ...

  8. Win32 C++项目移植到 Win10 UWP

    本文可能对谁有帮助 如果你正在做将现有的Win32 静态库 或 DLL 工程移植到Win10 UWP(通用 Windows) 环境,这篇文章可能会对你有帮助. 概述 在VS2015的 新建项目 -&g ...

  9. python对excel进行筛选-PythonEXCEL读取-保存-矩阵合并-条件筛选

    PythonEXCEL读取-保存-矩阵合并-条件筛选 2018-04-23 10:57阅读: 南北山泉 博主很神秘,什么也没有留下~ 关注 # 监测点1的预处理,选出降雨量大于0的数据 import ...

  10. Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

    安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...

最新文章

  1. MySQL字符集编码
  2. Learning to Rank简介
  3. hibernate入门知识-01
  4. Objective-C中@property的所有属性详解
  5. 事务管理基础:数据库的并发控制相关知识笔记
  6. swiper轮播插件的使用
  7. 60-008-024-使用-命令-flink如何动态支持依赖jar包提交
  8. Java定时器的cron设置详解Quartz
  9. Tensorflow的快速安装(张量图例)
  10. #Java学习#实验考试题
  11. CTA 策略分享之三 -- 策略优化
  12. POJ1324 Holedox Moving(BFS)
  13. Android有线IPV6总结(二):内核中RS与RA的一点学习
  14. centos7 vi保存退出_linux vi保存退出命令 (如何退出vi)
  15. 美国计算机科学奥林匹克竞赛试题acsl,2020年国际数学奥林匹克竞赛试题全部出炉,网友:给答案都看不懂...
  16. 基于FPGA的双极性DDS设计与仿真
  17. EJB_开发EJB容器模型的WEB服务
  18. discuz数据库结构表
  19. 如何批量去水印?水印云批量去水印工具
  20. CC2640R2F BLE5.0 开发向导

热门文章

  1. 大数据处理系统都有哪些?(批处理系统与迭代计算系统)
  2. Java实现CRC16 CCITT
  3. Python快速复制浏览器中的Request
  4. Hibernate tools的hbm2ddl和hbm2java
  5. 球球大作战显示短信服务器出错,球球大作战常见问题汇总 新版本问题解决方法...
  6. note2刷 android 5.0.2,三星Galaxy Note Pro 12.2 Android 5.0.2更新锁定了竞争对手的键盘
  7. HDU - 6609
  8. 整合腾讯云地图的绘制和编辑几何图形
  9. s32k144 isystem linux,S32K144之时钟配置
  10. 关于系统迁移到固态硬盘后,新系统引导项丢失的问题