MetroApp保存UIEment为图片
写本文的起因是想截取Metro App画面作为图片来使用Win8的共享。
话说自从大MS的客户端UI技术进入XAML时代之后,每次截屏的代码都不太一样,无论silverlight、WPF还是Windows Phone都不完全一样,搞得我头昏脑胀,每次都要搜索一下才写的出来。反观Winform许久未写,如何截屏我还记得一清二楚……真是尴尬……顺带吐槽Metro的各种奇葩Stream类,那跟.NET的Stream类互转那叫一个惨烈和别扭啊。
花开两头,各表一枝。接下来我们进入今天的正题——如何在Metro下截屏,我再吐槽一下MS,这个截屏用的API似乎Win8.1才开放,还在用Win8的话还是撸撸睡吧……
首先我们要用到一个奇葩类,这次真的不是WriteableBitmap了,这次的主角是叫做RenderTargetBitmap。
var bitmap = new RenderTargetBitmap();
await bitmap.RenderAsync(this.rootGrid);
IBuffer buffer = await bitmap.GetPixelsAsync();
var stream = buffer.AsStream();
要想转换UIElement到Stream,通过以上几步就可以了,this.rootGrid是一个UIElement控件,也就是我想保存的图像。值得一提的是AsStream是一个扩展方法,记得要添加namespace System.Runtime.InteropServices.WindowsRuntime哟!
如果是WPF应用,得到Stream之后存为图片文件是很容易的事情了,分分钟秒杀的程度,问题Metro下面还需要再折腾折腾……
首先你需要创建一个StorageFile来存放这个图片,一个比较容易的方式是使用FileSavePicker。
FileSavePicker savePicker = new FileSavePicker();
savePicker.SuggestedStartLocation = PickerLocationId.Desktop;
savePicker.FileTypeChoices.Add("Bitmap", new List<string>() { ".png" });
savePicker.SuggestedFileName = "New Bitmap"; StorageFile savedItem = await savePicker.PickSaveFileAsync();
接下来你可能会想StorageFile也有了,Stream也有了,应该往StorageFile里写Stream就行了。
可惜不是,直接使用FileIO.WriteBufferAsync的方法来写入图片文件是不行的。文件会无法作为图片正常显示。
我们需要使用BitmapEncoder来写入Stream,而WinRT下的这个BitmapEncoder,又需要WinRT的IRandomAccessStream才能使用。
Guid encoderId = BitmapEncoder.PngEncoderId;
IRandomAccessStream fileStream = await savedItem.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);
BitmapEncoder encoder = await BitmapEncoder.CreateAsync(encoderId, fileStream);
byte[] pixels = new byte[pixelStream.Length];
pixelStream.Read(pixels, , pixels.Length); //pixal format shouldconvert to rgba8
for (int i = ; i < pixels.Length; i += )
{
byte temp = pixels[i];
pixels[i] = pixels[i + ];
pixels[i + ] = temp;
} encoder.SetPixelData(
BitmapPixelFormat.Rgba8,
BitmapAlphaMode.Straight,
(uint)bitmap.PixelWidth,
(uint)bitmap.PixelHeight,
, // Horizontal DPI
, // Vertical DPI
pixels); await encoder.FlushAsync();
本篇我们简单讨论了如何在MetroApp下截屏保存图片,下篇会根据本篇的成果来讨论一下Win8.1如何共享截屏的图片。同时会简单的提到.NET的Stream和WinRT的Stream的转换。
本篇的参考资料:
Windows 8.1 Apps with XAML and C# Unleashed
这本书是Google搜索出了某个章节正好提到了RenderTargetBitmap,这会貌似又打不开了,感谢方校长八辈祖宗!这书出中文版了可以买一本!
Win8 Metro(C#) 数字图像处理--图像打开,保存
图片文件BitmapEncoder是学习自这位仁兄的文章!
韦恩卑鄙
该参考资料明确指出了直接FileIO.WriteBufferAsync写入是不行的。
MetroApp保存UIEment为图片的更多相关文章
- CSharpGL(19)用glReadPixels把渲染的内容保存为PNG图片(C#)
CSharpGL(19)用glReadPixels把渲染的内容保存为PNG图片(C#) 效果图 本文解决了将OpenGL渲染出来的内容保存到PNG图片的方法. 下载 CSharpGL已在GitHub开 ...
- 【VC++技术杂谈006】截取电脑桌面并将其保存为bmp图片
本文主要介绍如何截取电脑桌面并将其保存为bmp图片. 1. Bmp图像文件组成 Bmp是Windows操作系统中的标准图像文件格式. Bmp图像文件由四部分组成: (1)位图头文件数据结构,包含Bmp ...
- 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码
ffmpeg开源库,实现将bmp格式的图片编码成x264文件,并将编码好的H264文件解码保存为BMP文件. 实现将视频文件yuv格式保存的图片格式的測试,图像格式png,jpg, gif等等測试均O ...
- PHP《将画布(canvas)图像保存成本地图片的方法》
用PHP将网页上的Canvas图像保存到服务器上的方法 2014年6月27日 歪脖骇客 发表回复 8 在几年前HTML5还没有流行的时候,我们的项目经理曾经向我提出这样一个需求:让项目评审专家们在评审 ...
- [转]RGB数据保存为BMP图片
转自:http://blog.csdn.net/yixianfeng41/article/details/52591585 一.BMP文件由文件头.位图信息头.颜色信息和图形数据四部分组成. 1.BM ...
- [ActionScript 3.0] 通过BitmapData将对象保存成jpg图片
此方法需要用到JPGEncoder.as和BitString.as这两个类,是将BitmapData对象转换成ByteArray,然后通过FileStream把此ByteArray写入到文件保存成jp ...
- javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片
javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转 ...
- 前端js保存页面为图片下载到本地
前端js保存页面为图片下载到本地 手机端点击下载按钮将页面保存成图片到本地 前端js保存页面为图片下载到本地的坑 html2canvas 识别 svg 解决方案 方案 html2canvas.js:可 ...
- 纯C++代码实现将像素矩阵保存为bmp图片
由于工作需要,时常需要将像素矩阵保存图片显示观看.为此,特地总结了三种使用纯C++代码生成bmp图片的方法.分别是使用自定义数据.从外界导入的txt和csv以及从图片中导入的数据. 1.使用自定义数据 ...
随机推荐
- icil 参考docker
@All 有不知道怎么用docker发布项目的,请参考 http://192.168.18.224:8888/svn/Enterprise/site/docker/overview of docker ...
- 我对if(!this.IsPostBack)的理解
if(!this.IsPostBack) { } 通常用在page_load中,获取一个值,该值指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问,如果是为响应客户端回发而加载该页,则 ...
- ubuntu upstart启动流程分析
ubuntu自从6.10版本之后就使用了较新的upstart机制来进行系统的初始化. upstart是一种基于事件驱动的服务启动机制,可以使多个系统任务在保持依赖关系的前提下并发启动(据说这样这样启动 ...
- getattr()函数详解
setattr(object,name,value): 作用:设置object的名称为name(type:string)的属性的属性值为value,属性name可以是已存在属性也可以是新属性. get ...
- StringUtil字符串工具类
package com.zjx.test03; /** * 字符串工具类 * @author * */ public class StringUtil { /** * 判断是否是空 * @param ...
- DateJsonValueProcessor日期处理
package com.zjx.controller; import java.text.SimpleDateFormat; import net.sf.json.JsonConfig; import ...
- 初始化centoS 相关
install aspnetcoremodule for iis https://docs.microsoft.com/en-us/aspnet/core/publishing/iis?tabs=as ...
- express + mongodb 搭建一个简易网站(一)
express + mongodb 搭建一个简易网站(一) 前言:后台使用node.js的express框架,数据库使用mongodb,模板使用ejs.大概就这些. 开始第一个简易网站之旅吧.... ...
- 刚刚明白了for循环写三角形
for(int a = 15; a >=1; a--) { for(int b = a - 1; b >=0; b--) { System.out.print("A") ...
- 利用 AWK 的数值计算功能提升工作效率(转载)
Awk 是一种优秀的文本样式扫描和处理工具.转文侧重介绍了 awk 在数值计算方面的运用,并通过几个实际工作中的例子,阐述了如何利用 awk 的计算功能来提高我们的工作效率.转文源自IBM Bluem ...