• win2d 图片水印


    本文告诉大家如何使用 win2d 给图片加上水印。

    安装

    首先需要使用 Nuget 安装 win2d ,安装参见win10 uwp win2d

    如果没有更新 dot net core 那么在运行可能会出现下面异常System.TypeLoadException: Requested Windows Runtime type 'Microsoft.Graphics.Canvas.Text.CanvasTextLayout' is not registered

    那么直接更新 dot net core 到最新,然后清理项目就可以

    获得图片

    要对图片处理,首先需要拿到图片,拿到图片的方法可以是从剪贴板获得或者使用文件选取拿到。

    如果是从剪贴板拿到图片,需要把图片保存到本地的临时文件夹,然后拿到文件。

    如果使用文件选取拿到文件,可以使用这个方法

              var pick = new FileOpenPicker();
                pick.FileTypeFilter.Add(".jpg");
                pick.FileTypeFilter.Add(".png");
    
                var file = await pick.PickSingleFileAsync();
    

    注意后缀名用的是 .+后缀名,这里我写的是很少的图片后缀名,实际上可以支持的图片后缀是很多。

    创建图片

    如果需要对图片处理,使用的是 CanvasRenderTarget ,可以看到这个类需要传入两个参数ICanvasResourceCreatorWithDpiSize,我也就使用这个函数

    在 win2d 使用图片需要 CanvasBitmap ,这个类不可以直接创建,需要通过LoadAsyncCreateFromBytesCreateFromColorsCreateFromSoftwareBitmap 这些方法来创建,下面就使用第一个方法创建。

    第一个方法有很多重载,需要注意,如果不是解决方案里的文件,千万不要使用文件名或 URI 的方法,因为经常出现文件无法访问。

    如果不是解决方案里的文件,千万不要使用 fileName 或 URI 的方法读取图片,因为一般的文件是没有权限。即使使用 FilePick 拿到文件,文件的路径也可能拿不到。

    建议使用的方法是使用流的重载,在上面,已经拿到文件,这时把文件读出来,传入就可以

    var duvDbecdgiu =
                    await CanvasBitmap.LoadAsync(new CanvasDevice(true), await _file.OpenAsync(FileAccessMode.Read));
    

    处理图片

    现在创建 CanvasRenderTarget 处理图片,在使用 CanvasRenderTarget 记得释放,所以一般需要使用下面代码

     using (var canvasRenderTarget = new CanvasRenderTarget(duvDbecdgiu, duvDbecdgiu.Size))
    

    创建一个图片处理,大小就和图片大小相同。

    在图片添加文字的方法实际上和在 win2d 的其他处理相同,具体可以去看我的win2d博客。

                    using (var dc = canvasRenderTarget.CreateDrawingSession())
                    {
                        dc.DrawImage(duvDbecdgiu);
                        dc.DrawText("lindexi",
                            new Vector2((float) (duvDbecdgiu.Size.Width / 2), (float) duvDbecdgiu.Size.Height/2), Colors.Black);
                    }
    

    也许大家会觉得上面的DrawImage是做什么的,刚才不是从图片创建的?实际上从图片创建,但是没有画图片,也就是在使用的时候需要先画图片,然后画出文字。

    保存

    现在尝试保存一个图片,保存需要让用户选一个文件

            var pick = new FileSavePicker();
                    pick.FileTypeChoices.Add("image", new List<string>() {".jpg"});
    
                    var file = await pick.PickSaveFileAsync();
    

    保存很简单

    await canvasRenderTarget.SaveAsync(await file.OpenAsync(FileAccessMode.ReadWrite),CanvasBitmapFileFormat.Jpeg);
    

    注意保存的格式可以是很多,但是后缀名需要和保存的格式相同。

    现在这个功能写在图床

    在这里插入图片描述

    我搭建了自己的博客 https://lindexi.gitee.io/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

    如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

  • 相关阅读:
    设计模式JS中的单例模式应用(一)
    SSD5_ Exercise 4分析
    JavaEE学习笔记
    SSD5_Exercise5分析
    SSD5_Optional Exercise6分析
    ACM相关网站
    hdu 2066 一个人的旅行【Dijkstra 12级新生训练—图论E】
    新队员图论基础_【CSUST_12级训练】
    hdu 2112 Today【F map + Floyd 入门训练】
    turtle库笔记
  • 原文地址:https://www.cnblogs.com/lindexi/p/12087221.html
Copyright © 2020-2023  润新知