手机版

NET生成水印示例代码的更好方法

时间:2021-08-21 来源:互联网 编辑:宝哥软件园 浏览:

前言

众所周知,为了保护知识产权,防止资源被盗,水印在博客、网店等场景中非常常见。

本文首先论证了基于系统的正常运行。然后,基于Direct2D/WIC/DirectWrite,演示了一种新的不同的“骚”操作。

方法1-系统。绘制水印图片

系统。画图.图片原本是GDI的一部分,是Windows Only。但是,随着NuGet包系统的发布。绘图。公共,系统。绘图。图像现在支持linux:

安装包系统。下面的代码演示了如何在图片上添加水印:

//水印var水标流=新内存流();使用(var img=image。来自流(文件。openread (@' d: \ _ \水印演示。png ')){使用(var graphic=graphics。from image(img)){ var font=new font(' Microsoft yahei ',30岁,fontstyle。大胆。变化颜色=颜色。FromArgb(128,255,255,255);var brush=新的SolidBrush(颜色);变化点=新点。宽度- 130,img。身高-50);图形。拉绳('水印在这里',字体,画笔,点);img。保存(watermarkedStream,ImageFormat。png);}}效果如图(不带黄色剪刀):

附件:Edi。王做了一个NuGet包,里面可以轻松配置水印参数:

https://github.com/EdiWang/Edi.图片水印

文章:https://EDI . Wang/post/2018/10/12/add-watermark-to-uploaded-image-aspnet-core

方法2-使用2-Direct2D/WIC为图片添加水印

Direct2D起源于Windows 8/IE 10,安装IE 10后也可以使用Windows 7。Direct2D是基于Direct3D的,很明显是Windows Only。

Direct2D是Windows的下一代2D渲染库,与Direct2D一起发布,包括Windows成像组件(WIC)和DirectWrite。

相关说明和文档链接:

技术说明链接Direct2D硬件加速2D图形渲染Go WIC高性能图片编解码Go DirectWrite硬件加速文字渲染Go如果打开链接看一看,不难看出这些技术都是基于COM的,但是我们用的。NET,对吗?

幸运的是,我们有夏普DX

SharpDX封装了这些DirectX技术。在这个演示中,我们需要安装两个包:SharpDX。Direct2D1和SharpDX。数学:

安装包夏普DX。direct 2d 1-4 . 2 . 0版安装-打包sharp dx . mathematics-4 . 2 . 0版以下代码演示了如何使用sharp dx.direct2d1为图片添加水印:

使用D2D=夏普DX .Direct2D1使用DWrite=SharpDX .直写使用夏普DX使用夏普DX .IO;使用WIC=夏普DX .WIC;内存流添加水印(流文件名,字符串水印文本){使用(var wic=新wic .ImagingFactory2())使用(var d2d=新d2d .工厂())使用(var image=CreateWicImage(wic,fileName))使用(var wicBitmap=新wic .位图(wic,图像。尺寸,宽度,图像。尺寸,高度WIC .WIC,格式32bppPBGRA .使用(var目标=新D2D .wirendertarget(d2d,wicBitmap,新d2d .RenderTargetProperties()))使用(var bmppistructure=D2D .位图。FromWicBitmap位图(目标,图像))使用(var dwriteFactory=new SharpDX .DirectWrite。工厂())使用(var brush=新D2D .SolidColorBrush(目标,新颜色(0xff、0xff、0xff、0x7f)){ 0目标. BeginDraw();{目标。绘制位图(建筑,新矩形F(0,0,目标。尺寸,宽度,目标。尺寸。高度),1.0f,D2D .位图插值模式。线性);目标抽签.矩形(新矩形角度(0,0,目标。尺寸,宽度,目标。尺寸。高度),画笔);var textFormat=new DWrite .文本格式(数据工厂,)微软雅黑,DWrite .字体粗细。粗体,粗体FontStyle。正常,30.0f);目标DrawText(watermarkText,textFormat,new RectangleF(目标。尺寸。宽度- 130,目标。尺寸。高度- 50,整数MaxValue,int .MaxValue),画笔);}目标EndDraw();var ms=新内存流();SaveD2DBitmap(wic,wicBitmap,ms);返回ms;}}void SaveD2DBitmap(WIC .妇女幻想工厂。位图妇女位图,流输出流){使用(var编码器=新WIC .位图编码器(WIC威科工厂容器性能指南。png)){ 0编码器。初始化(输出流);使用(var框架=新WIC .BitmapFrameEncode(编码器)){ frame .初始化();框架设置大小(位图).尺寸,宽度,位图。尺寸。高度);var pixelFormat=wicBitmap .像素格式;框架设置像素格式(参考像素格式);框架写入源(WicBitmap);框架commit();编码器commit();} }}WIC .格式转换器创建图像(WIC .使用(var解码器=新WIC .新WIC .WICStream(wicFactory,stream);解码器。初始化(去破坏束WIC .解码选项。CacheOnLoad);使用(var decodeFrame=解码器GetFrame(0)) { var转换器=新WIC .格式转换器;转换器。初始化(解码WIC .像素格式。格式32 bpppbgra);返回转换器;} }}调用方式:

文件writelbytes(@ ' d : \ _ \ demo 2。' png ',添加水印(文件打开read(@ ' d : \ _ \ watermarkdemo。png '),'水印在此').ToArray());效果也是一切正常:

有什么区别?

系统。图画只花了14行Direct2D却需要整整60行!复杂程度惊人!为什么要舍简单求复杂呢?

因为系统。图画没有硬件加速,而且生成的图片也没有反走样(抗锯齿),这导致使用系统。图画相比之下较慢,而且生成图片的效果稍差:

很明显可以看出Direct2D生成的图片更平滑。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

版权声明:NET生成水印示例代码的更好方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。