2018-8-10-win10-uwp-读取保存WriteableBitmap-、BitmapImage
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相关推荐
- win10 uwp 入门
UWP是什么我在这里就不说,本文主要是介绍如何入门UWP,也是合并我写的博客. 关于UWP介绍可以参见:http://lib.csdn.net/article/csharp/32451 首先需要申请一 ...
- win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序
本文是一个非常简单的博客,让大家知道如何使用 asp dot net core 做后台,使用 UWP 或 WPF 等做前台. 本文因为没有什么业务,也不想做管理系统,所以看到起来是很简单. Visua ...
- win10 uwp 使用 Microsoft.Graph 发送邮件
在 2018 年 10 月 13 号参加了 张队长 的 Office 365 训练营 学习如何开发 Office 365 插件和 OAuth 2.0 开发,于是我就使用 UWP 尝试使用 Micros ...
- win10 UWP 序列化
将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. <!--more-- ...
- 如何更新微软的html,如何升级微软2018 Windows 10更新四月正式版17134系统?
微软已经正式发布了2018 Windows 10更新四月版系统,版本号是Build 17134,目前微软提供了多种升级途径,那么,如何升级微软2018 Windows 10更新四月正式版17134系统 ...
- win10 UWP Controls by function
Windows的 XAML UI 框架提供了很多控件,支持用户界面开发库. 我现在做的一个中文版的,很多都是照着微软写,除了注释 我们先学微软做一个简单的frame,新建Page,里面放title和跳 ...
- win10 UWP 剪贴板 Clipboard
本文告诉大家如何使用剪贴板 Clipboard 读取剪贴板和放内容在剪贴板 在 win10 UWP 可以通过 Windows.ApplicationModel.DataTransfer.Clipboa ...
- Win32 C++项目移植到 Win10 UWP
本文可能对谁有帮助 如果你正在做将现有的Win32 静态库 或 DLL 工程移植到Win10 UWP(通用 Windows) 环境,这篇文章可能会对你有帮助. 概述 在VS2015的 新建项目 -&g ...
- python对excel进行筛选-PythonEXCEL读取-保存-矩阵合并-条件筛选
PythonEXCEL读取-保存-矩阵合并-条件筛选 2018-04-23 10:57阅读: 南北山泉 博主很神秘,什么也没有留下~ 关注 # 监测点1的预处理,选出降雨量大于0的数据 import ...
- Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...
最新文章
- MySQL字符集编码
- Learning to Rank简介
- hibernate入门知识-01
- Objective-C中@property的所有属性详解
- 事务管理基础:数据库的并发控制相关知识笔记
- swiper轮播插件的使用
- 60-008-024-使用-命令-flink如何动态支持依赖jar包提交
- Java定时器的cron设置详解Quartz
- Tensorflow的快速安装(张量图例)
- #Java学习#实验考试题
- CTA 策略分享之三 -- 策略优化
- POJ1324 Holedox Moving(BFS)
- Android有线IPV6总结(二):内核中RS与RA的一点学习
- centos7 vi保存退出_linux vi保存退出命令 (如何退出vi)
- 美国计算机科学奥林匹克竞赛试题acsl,2020年国际数学奥林匹克竞赛试题全部出炉,网友:给答案都看不懂...
- 基于FPGA的双极性DDS设计与仿真
- EJB_开发EJB容器模型的WEB服务
- discuz数据库结构表
- 如何批量去水印?水印云批量去水印工具
- CC2640R2F BLE5.0 开发向导
热门文章
- 大数据处理系统都有哪些?(批处理系统与迭代计算系统)
- Java实现CRC16 CCITT
- Python快速复制浏览器中的Request
- Hibernate tools的hbm2ddl和hbm2java
- 球球大作战显示短信服务器出错,球球大作战常见问题汇总 新版本问题解决方法...
- note2刷 android 5.0.2,三星Galaxy Note Pro 12.2 Android 5.0.2更新锁定了竞争对手的键盘
- HDU - 6609
- 整合腾讯云地图的绘制和编辑几何图形
- s32k144 isystem linux,S32K144之时钟配置
- 关于系统迁移到固态硬盘后,新系统引导项丢失的问题