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.使用自定义数据 ...
随机推荐
- 0_Simple__template
简单的 CUDA 应用模板,白送的 Sample. ▶ 源代码 //template_cpu.cpp extern "C" void computeGold(float *, co ...
- 0_Simple__simpleZeroCopy
两种方法使用零拷贝内存做简单的向量加和,并评估 GPU 计算结果与 CPU 计算结果的差. ▶ 源代码 #include <stdio.h> #include <cuda.h> ...
- sqlserver查询---分配cpu等资源
数据库资源按需分配 https://www.cnblogs.com/i6first/p/4138365.html https://blog.csdn.net/kk185800961/article/d ...
- [python爬虫] Selenium定向爬取PubMed生物医学摘要信息
本文主要是自己的在线代码笔记.在生物医学本体Ontology构建过程中,我使用Selenium定向爬取生物医学PubMed数据库的内容. PubMed是一个免费的搜寻引擎,提供生物医学方 ...
- python 之九九乘法表
for i in range(1,10): for j in range(1,i+1): print(f"{j}*{i}={i*j}",end='\t') print() 运行结果 ...
- windows与linux环境查看jdk安装路径
windows: set java_home 查看jdk安装路径 java -version 查看jdk版本 linux: whereis java which java(java执行路径) echo ...
- eclipse中maven多模块项目的创建、提交和检出
1.创建父项目:maven项目.创建完成后删除src目录:删除项目属性java builder中的src目录. 2.在父项目中创建maven module子项目. 3.修改pom文件,添加依赖,修改g ...
- VC中使用ADO操作数据库的方法
源地址:http://blog.csdn.net/xiaobai1593/article/details/7459862 准备工作: (1).引入ADO类 #import "c:\progr ...
- 扩展C#与元编程(一)
众所周知,Roslyn project已经开源一年多了.简单的说,Roslyn是:1)用C#/VB写的C#/VB的编译器,以及与IDE集成:2)编译器的功能以API的方式暴露出来(即一组DLL). R ...
- 在spring MVC 中关于session失效的判断 有一个类SessionStatus
SessionStatus status 表示的是当前Session的状态 status.isComplete()-->为true时,表示当前Session还未过期;-->false,表 ...