幸运蛋蛋pc开奖
这篇文章主要给大家介绍了关于.NET中生成水印更好的方法,文中通过示例代码介绍的非常详细,对大家学习或者使用.NET具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

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

本文首先演示了基于System.Drawing.Image做正常操作。然后基于Direct2D/WIC/DirectWrite,演示了一种全新、不同的?#21543;А?#25805;作。

方法1-System.Drawing给图片加水印

System.Drawing.Image原生属于GDI的一部分,是Windows Only,但随着NuGet包System.Drawing.Common的发布,现在System.Drawing.Image已经支持linux:

Install-Package System.Drawing.Common -Version 4.5.1

以下代码演示了如何从给图片加水印:

// 加水印
var watermarkedStream = new MemoryStream();
using (var img = Image.FromStream(File.OpenRead(@"D:\_\WatermarkDemo.png")))
{
 using (var graphic = Graphics.FromImage(img))
 {
  var font = new Font("微软雅黑", 30, FontStyle.Bold, GraphicsUnit.Pixel);
  var color = Color.FromArgb(128, 255, 255, 255);
  var brush = new SolidBrush(color);
  var point = new Point(img.Width - 130, img.Height - 50);

  graphic.DrawString("水印在此", font, brush, point);
  img.Save(watermarkedStream, ImageFormat.Png);
 }
}

效果如图(没有剪头):


附:Edi.Wang做了一个NuGet包,可以轻松地配置水印参数:

NuGet:https://github.com/EdiWang/Edi.ImageWatermark

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

方法2-Direct2D/WIC给图片加水印

Direct2D源于Windows 8/IE 10,安装IE 10之后,Windows 7也能用。Direct2D基于Direct3D,很显然,是Windows Only的。

Direct2D是Windows下一代的2D渲染库,随着Direct2D一起发布的,还有Windows Imaging Component(简称WIC)和DirectWrite。

相关说明和文?#30423;?#25509;:

技术说明链接Direct2D基于硬件加速的2D图形渲染GoWIC高性能图片编码、解码GoDirectWrite基于硬件加速的文字渲染Go

如果您打开链接看了一眼,就不难看出,这些技术都是基于COM的,但我们使用.NET,不是吗?

好在我们有SharpDX

SharpDX对这些DirectX技术做了封装,在这个Demo中,我们需要安装SharpDX.Direct2D1和SharpDX.Mathematics两个包:

Install-Package SharpDX.Direct2D1 -Version 4.2.0
Install-Package SharpDX.Mathematics -Version 4.2.0

以下代码演示了如何使用SharpDX.Direct2D1给图片加水印:

using D2D = SharpDX.Direct2D1;
using DWrite = SharpDX.DirectWrite;
using SharpDX;
using SharpDX.IO;
using WIC = SharpDX.WIC;

MemoryStream AddWatermark(Stream fileName, string watermarkText)
{
  using (var wic = new WIC.ImagingFactory2())
  using (var d2d = new D2D.Factory())
  using (var image = CreateWicImage(wic, fileName))
  using (var wicBitmap = new WIC.Bitmap(wic, image.Size.Width, image.Size.Height, WIC.PixelFormat.Format32bppPBGRA, WIC.BitmapCreateCacheOption.CacheOnDemand))
  using (var target = new D2D.WicRenderTarget(d2d, wicBitmap, new D2D.RenderTargetProperties()))
  using (var bmpPicture = D2D.Bitmap.FromWicBitmap(target, image))
  using (var dwriteFactory = new SharpDX.DirectWrite.Factory())
  using (var brush = new D2D.SolidColorBrush(target, new Color(0xff, 0xff, 0xff, 0x7f)))
  {
    target.BeginDraw();
    {
      target.DrawBitmap(bmpPicture, new RectangleF(0, 0, target.Size.Width, target.Size.Height), 1.0f, D2D.BitmapInterpolationMode.Linear);
      target.DrawRectangle(new RectangleF(0, 0, target.Size.Width, target.Size.Height), brush);
      var textFormat = new DWrite.TextFormat(dwriteFactory, "微软雅黑", DWrite.FontWeight.Bold, DWrite.FontStyle.Normal, 30.0f);
      target.DrawText(watermarkText, textFormat, new RectangleF(target.Size.Width - 130, target.Size.Height - 50, int.MaxValue, int.MaxValue), brush);
    }
    target.EndDraw();

    var ms = new MemoryStream();
    SaveD2DBitmap(wic, wicBitmap, ms);
    return ms;
  }
}

void SaveD2DBitmap(WIC.ImagingFactory wicFactory, WIC.Bitmap wicBitmap, Stream outputStream)
{
  using (var encoder = new WIC.BitmapEncoder(wicFactory, WIC.ContainerFormatGuids.Png))
  {
    encoder.Initialize(outputStream);
    using (var frame = new WIC.BitmapFrameEncode(encoder))
    {
      frame.Initialize();
      frame.SetSize(wicBitmap.Size.Width, wicBitmap.Size.Height);

      var pixelFormat = wicBitmap.PixelFormat;
      frame.SetPixelFormat(ref pixelFormat);
      frame.WriteSource(wicBitmap);

      frame.Commit();
      encoder.Commit();
    }
  }
}

WIC.FormatConverter CreateWicImage(WIC.ImagingFactory wicFactory, Stream stream)
{
  using (var decoder = new WIC.PngBitmapDecoder(wicFactory))
  {
    var decodeStream = new WIC.WICStream(wicFactory, stream);
    decoder.Initialize(decodeStream, WIC.DecodeOptions.CacheOnLoad);
    using (var decodeFrame = decoder.GetFrame(0))
    {
      var converter = new WIC.FormatConverter(wicFactory);
      converter.Initialize(decodeFrame, WIC.PixelFormat.Format32bppPBGRA);
      return converter;
    }
  }
}

调用方式:

File.WriteAllBytes(@"D:\_\Demo2.png", AddWatermark(File.OpenRead(@"D:\_\WatermarkDemo.png"), "水印在此").ToArray());

效果也是一切正常:


有什么区别?

System.Drawing只花了14行,Direct2D却需要整整60行!复杂程?#26579;?#20154;!为什么要舍简单求复杂呢?

因为System.Drawing没有硬件加速,而且生成的图片也没有反走样(Anti-aliasing),这导致使用System.Drawing相比之下?#19979;?#32780;且生成图片的效果稍差:

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

总结

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

最新资讯
瑞幸高管解读财报:合伙人模式反馈很好 数据还需时间

瑞幸高管解读财报:合

瑞幸咖啡11月13日公布了截至9月30日的2019年第三季度
傅盛:猎户星空签署B轮融资协议 11月底完成交易

傅盛:猎户星空签署B轮

猎豹移动董事长兼CEO傅盛宣布,在第三季度,猎户星空和外
?#32654;?0亿,斥1亿成立电商公司 董明珠在下什么大棋?

?#32654;?0亿,斥1亿成立电

很少进行价格战的格力,在双11中高调?#32654;?0亿元进行促销
腾讯高管解读三季度财报:游戏开发能力被消费者认可

腾讯高管解读三季度财

财报显示,腾讯第三季度营收972亿元,同比增长20.6%;第三季
16寸屏苹果MacBook Pro终于发布:屏幕大了 键盘改进

16寸屏苹果MacBook Pr

苹果公司刚刚正式推出了16英寸MacBook Pro,没有发布会,
16寸苹果MacBook Pro上手:它大了 也强了

16寸苹果MacBook Pro

这产品是2016年MacBook Pro大?#30446;?#20043;后的第一次重大升
最新文章
.NET生成水印更好的方法实例代码

.NET生成水印更好的方

这篇文章主要给大家介绍了关于.NET中生成水印更好的方
ASP.NET如何自定义项目模板详解

ASP.NET如何自定义项

这篇文章主要给大家介绍了关于ASP.NET如何自定义项目
.NET生成动态验证码的完整步骤

.NET生成动态验证码的

这篇文章主要给大家介绍了关于.NET生成动态验证码的完
ASP.NET Core MVC学习之视图组件(View Component)

ASP.NET Core MVC学习

这篇文章主要给大家介绍了关于ASP.NET Core MVC学习之
你应该知道的.NET错误与异常处理机制

你应该知道的.NET错误

这篇文章主要给大家介绍了关于.NET错误与异常处理机制
WCF中使用nettcp协议进行通讯的方法

WCF中使用nettcp协议

这篇文章主要给大家介绍了关于WCF中使用nettcp协议进
幸运蛋蛋pc开奖 三公技巧出九点规律 安徽快三方法 打三公怎样才能赢钱 天天爱捕鱼vip9多少钱 赚钱真不容易图片 时时彩技术交流群 棒球比分多少算赢 北京pk10跨度走势图 梦幻街机电玩城安卓版 抢21游戏规则