title author date CreateTime categories
win10 uwp 截图 获取屏幕显示界面保存图片
lindexi
2019-09-02 12:57:38 +0800
2018-2-13 17:23:3 +0800
Win10 UWP

本文主要讲如何保存我们的屏幕显示的控件,保存为图片。这个也就是截图,截我们应用显示的,我们应用之外的不截图。

UWP有一个功能,可以截图,截图使用的类是 RenderTargetBitmap

我们首先写一个Grid,我们需要给他名字,我这里给他Stamp,需要名称可以让我们在后面使用截图用到元素。

然后我们可以使用RenderTargetBitmap保存我们屏幕Grid显示的元素,请看下面代码

            var bitmap = new RenderTargetBitmap();
StorageFile file = await KnownFolders.PicturesLibrary.CreateFileAsync("1.jpg",
CreationCollisionOption.GenerateUniqueName);
await bitmap.RenderAsync(Stamp);
var buffer = await bitmap.GetPixelsAsync();
using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
var encod = await BitmapEncoder.CreateAsync(
BitmapEncoder.JpegEncoderId, stream);
encod.SetPixelData(BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Ignore,
(uint)bitmap.PixelWidth,
(uint)bitmap.PixelHeight,
DisplayInformation.GetForCurrentView().LogicalDpi,
DisplayInformation.GetForCurrentView().LogicalDpi,
buffer.ToArray()
);
await encod.FlushAsync();
}

await bitmap.RenderAsync(Stamp); 能把一个UIelement显示转为图片,不过这个图片我们需要用 BitmapEncoder 才可以保存为我们的图片

BitmapEncoder可以保存为bmp、jpg、gif、png,上面代码保存为 jpg ,但是一般保存为 png 比较好

保存需要使用SetPixelData BitmapPixelFormat pixelFormat, BitmapAlphaMode alphaMode, System.UInt32 width, System.UInt32 height, System.Double dpiX, System.Double dpiY, [Range(0, int.MaxValue)] System.Byte[] pixels 参数大概可以使用我的代码,不过上面代码使用的 dpi 不是 96 可能在不同的用户保存的图片不同。不过因为他截图的图片 像素本来就不是和其他的用户相同,所以使用这个方式保存是可以的。

我们在Grid放一个Image,然后可以看到,我们的原图

我们把图片一部分不显示,截图下来看下不显示的是不是就不会在图片。也就是截图是不是只截显示的元素

       <Grid x:Name="Stamp" >
<Image x:Name="image" Width="500"
Margin="200,10,10,10">
</Image>
</Grid>

可以看到图片有部分被裁掉

假如我们不显示Grid,使用的方法就是让 Grid 被另一个 Grid 挡住,这时对被挡住的Grid截图,看是否还可以拿到 Grid 显示的内容。

  <Grid Grid.Row="0" Background="White"></Grid>

截图之后可以看到结果没影响

那么我们要显示我们的图片显示全,我们可以借用一个简单的控件

        <ScrollViewer VerticalScrollBarVisibility="Visible"
HorizontalScrollBarVisibility="Visible">
<Grid x:Name="Stamp" >
<Image x:Name="image" Width="500"
Margin="300,10,10,10">
</Image>
</Grid>
</ScrollViewer>

我们的图片不会被遮盖,因为我们可以有无限空间

我们可以在滚动条写大小为很小,但是Width="1"就出错,我们不需要把他放在用户可视的,也就是放在最底层也是可以

水印

UWP图片水印简单,我们需要一个Image和一个水印,水印在图片Zindex比他大

我们在我们图片的同个Panel放一个TextBlock,然后TextBlock就是我们的水印。

            <Grid x:Name="Stamp">
<Image x:Name="image" Width="500"
Margin="300,10,10,10" />
<TextBlock Text="blog.csdn.net/lindexi_gd"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>

可以看到我们有了水印,虽然这样看起来一定都不觉得是好的。(我不想说很烂)

如果遇到了全黑的图,我们还没办法加水印,但是基本99%的图是可以的。(谁说的,代码是黑的,vs背景用黑的好多)

如果想要改颜色,每个颜色改为和图不同的,好难。

我想到渐变,这样每个颜色都有。LinearGradientBrush是渐变,我们需要每个字符都看到,我们把渐变改为从上到下。EndPoint="0,1" StartPoint="0,0"一个是开始的Point,一个是结束

                    <TextBlock.Foreground>
<LinearGradientBrush EndPoint="结束点X,结束点Y" StartPoint="开始点X,开始点Y">
<GradientStop Color="颜色 默认offset=0"/>
<GradientStop Color="White" Offset="1 1就是100%"/>
</LinearGradientBrush>
</TextBlock.Foreground>

说到这,我们来总的说下,就是用一个滚动条把我们的一个Grid放进去,然后Grid里面存在一张图片和一个TextBlock,图片就是我们需要加水印的,TextBlock就是水印,水印颜色最好渐变,然后使用获取元素图片截图。保存截图就是我们的图片加水印,做法很简单。

如果对大图感觉水印太小,可以用ViewBox。如果觉得我们水印要在中间,或下方或其他,那么我们需要把Image的宽度不设置,然后Grid也不设置高度和宽度。

        <ScrollViewer Width="10" Height="10"
VerticalScrollBarVisibility="Visible"
HorizontalScrollBarVisibility="Visible">
<Grid x:Name="Stamp">
<Image x:Name="image" HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="10,10,10,10" />
<TextBlock Text="blog.csdn.net/lindexi_gd"
HorizontalAlignment="Center"
VerticalAlignment="Center" >
<TextBlock.Foreground>
<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="Black"/>
<GradientStop Color="White" Offset="1"/>
</LinearGradientBrush>
</TextBlock.Foreground>
</TextBlock>
</Grid>
</ScrollViewer>

参见:http://www.zmy123.cn/?p=1257

因为保存的图片比较大,我在找压缩图片的算法,找到了这个博客 用C#开发一个WinForm版的批量图片压缩工具 - CSDN博客 还有 GDI+ 如何将图片绘制成圆形的图片 - CSDN博客

2019-9-2-win10-uwp-截图-获取屏幕显示界面保存图片的更多相关文章

  1. win10 uwp 截图 获取屏幕显示界面保存图片

    本文主要讲如何保存我们的屏幕显示的,保存为图片,也就是截图,截我们应用显示的. UWP有一个功能,可以截图,RenderTargetBitmap 我们首先写一个Grid,我们需要给他名字,我这里给他S ...

  2. win10 uwp 后台获取资源

    本文告诉大家,从后台代码获取界面定义的资源. 如果一个资源是写在 App 的资源,那么如何使用代码去获得他? 简单的方法是使用下面的代码 Application.Current.Resources[& ...

  3. win10 uwp 毛玻璃

    毛玻璃在UWP很简单,不会和WPF那样伤性能. 本文告诉大家,如何在 UWP 使用 win2d 做毛玻璃. 毛玻璃可以使用 win2D 方法,也可以使用 Compositor . 使用 win2d 得 ...

  4. win10 uwp DataContext

    本文告诉大家DataContext的多种绑法. 适合于WPF的绑定和UWP的绑定. 我告诉大家很多个方法,所有的方法都有自己的优点和缺点,可以依靠自己喜欢的用法使用.当然,可以在新手面前秀下,一个页面 ...

  5. Win10/UWP开发—使用Cortana语音与App后台Service交互

    上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...

  6. win10 uwp 读取保存WriteableBitmap 、BitmapImage

    我们在UWP,经常使用的图片,数据结构就是 BitmapImage 和 WriteableBitmap.关于 BitmapImage 和 WriteableBitmap 区别,我就不在这里说.主要说的 ...

  7. win10 uwp ApplicationView

    原文:win10 uwp ApplicationView 本文和大家介绍一个重要的类,他可以用来设置窗口,如设置启动大小,设置是否允许截图,是否进入全屏,所有和窗口有关的,都可以在他这里设置. 可以使 ...

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

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

  9. Win10 UWP开发系列:实现Master/Detail布局

    在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...

随机推荐

  1. VS2017+QT5.12环境配置与动态链接库的生成

    最近需要重新编译一个DLL动态链接库,由于源码中包含了QT代码,所以现在需要配置VS+QT环境. 本人系统环境:Win10 64位 一.安装 Visual Studio 2017软件下载安装教程:ht ...

  2. sql 分组统计查询并横纵坐标转换

    关于sql 分组统计查询,我们在做报表的时候经常需要用到;今天就在这里整理下; 先附上一段sql代码: if object_id(N'#mytb',N'U') is not null drop tab ...

  3. cmd以管理员打开

  4. Pthread spinlock自旋锁

    锁机制(lock) 是多线程编程中最常用的同步机制,用来对多线程间共享的临界区(Critical Section) 进行保护. Pthreads提供了多种锁机制,常见的有:1) Mutex(互斥量): ...

  5. 如果try中有return那么finally中不要有return不然不会执行try中的return

    public class TryExer { public static void main(String[] args) { String test = test(); System.out.pri ...

  6. 关于spring java.lang.IllegalArgumentException: Name for argument type [java.lang.String] 的错误

    况描述: web工程在windows环境eclipse下编译部署没有问题,系统升级时需要运维从Git取相应的源码并编译部署到线上机器,部署启动正常没有错误,当访问业务的action时报错,如下. 错误 ...

  7. eclipse变量名自动补全

    对于编程人员来说,要记住大量的类名或类方法的名字,着实不是一件容易的事情.如果要IDE能够自动补全代码,那将为我们编程人员带来很大帮助. eclipse代码里面的代码提示功能默认是关闭的,只有输入“. ...

  8. 关于Mysql几周的整理文档

    https://files.cnblogs.com/files/swobble/mysql.rar 内容包括 版本测试(5.5,5.6,5.7) 平台测试(windows所有平台) 文件说明 精简说明 ...

  9. [JZOJ4639] 【NOIP2016提高组A组7.16】Angel Beats!

    题目 描述 题目大意 给你一棵树,每次询问两个点,求出这两个点的子树的重心到其中每个点的距离和. 重心的定义是到其中每个点距离和最小的点(不一定在两棵子树内) 思考历程 想想以前我是怎么求重心的呢-- ...

  10. 廖雪峰Java11多线程编程-3高级concurrent包-1ReentrantLock

    线程同步: 是因为多线程读写竞争资源需要同步 Java语言提供了synchronized/wait/notify来实现同步 编写多线程同步很困难 所以Java提供了java.util.concurre ...