- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章.NET生成水印更好的方法实例代码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
众所周知为了保护知识产权,防止资源被盗用,水印在博客、网店等场景中非常常见.
本文首先演示了基于System.Drawing.Image做正常操作。然后基于Direct2D/WIC/DirectWrite,演示了一种全新、不同的“骚”操作.
方法1-System.Drawing给图片加水印 。
System.Drawing.Image原生属于GDI的一部分,是Windows Only,但随着NuGet包System.Drawing.Common的发布,现在System.Drawing.Image已经支持linux:
1
|
Install-Package System.Drawing.Common -Version 4.5.1
|
以下代码演示了如何从给图片加水印:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// 加水印
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.
相关说明和文档链接:
。
技术 | 说明 | 链接 |
---|---|---|
Direct2D | 基于硬件加速的2D图形渲染 | Go |
WIC | 高性能图片编码、解码 | Go |
DirectWrite | 基于硬件加速的文字渲染 | Go |
。
如果您打开链接看了一眼,就不难看出,这些技术都是基于COM的,但我们使用.NET,不是吗?
好在我们有SharpDX 。
SharpDX对这些DirectX技术做了封装,在这个Demo中,我们需要安装SharpDX.Direct2D1和SharpDX.Mathematics两个包:
1
2
|
Install-Package SharpDX.Direct2D1 -Version 4.2.0
Install-Package SharpDX.Mathematics -Version 4.2.0
|
以下代码演示了如何使用SharpDX.Direct2D1给图片加水印:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
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;
}
}
}
|
调用方式:
1
|
File.WriteAllBytes(
@"D:\_\Demo2.png"
, AddWatermark(File.OpenRead(
@"D:\_\WatermarkDemo.png"
),
"水印在此"
).ToArray());
|
效果也是一切正常:
有什么区别?
System.Drawing只花了14行,Direct2D却需要整整60行!复杂程度惊人!为什么要舍简单求复杂呢?
因为System.Drawing没有硬件加速,而且生成的图片也没有反走样(Anti-aliasing),这导致使用System.Drawing相比之下较慢,而且生成图片的效果稍差:
很明显可以看出,Direct2D生成的图片更平滑.
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我的支持.
原文链接:https://www.cnblogs.com/sdflysha/p/better-way-to-generate-watermark.html 。
最后此篇关于.NET生成水印更好的方法实例代码的文章就讲到这里了,如果你想了解更多关于.NET生成水印更好的方法实例代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试使用水印并使用复杂过滤器应用 Yadif,但我无法弄清楚如何使用以下语法应用 Yadif ffmpeg -i "source:" -i C:\logo.png -c:v libx264 -p
我正在使用 zubrags PHP 水印脚本(附在下面),它工作得很好,除非我尝试使用 PNG-24 作为我的水印。生成的图像有一个乱码、不透明的水印。我想知道是否有人可以帮助解释我需要在下面的脚本中
基本上,我想拍摄用户从照片库中选择的图像,然后应用水印,即右下角的一个三角形,上面有应用程序名称。我已经在 Photoshop 中使用透明层制作了第二张图像。 我尝试了一个函数,我不记得它的确切名称,
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
这个问题我已经发了很多次了,但还是找不到正确的答案。我的目标是加载 PDF(扫描的调查问卷页),用页码标记每个页面,并将每个页面保存在单独的 JPEG 文件中以供以后使用。除了未绘制 NSString
你好,我的代码有问题 $obj = new stdClass(); $obj->cat_id = !empty($_POST['cat_id']) ? $_POST['cat_id']
SO 上有很多类似的问题/答案,但似乎没有一个能解决我的问题。 我的目标是使用 Paperclip 为图像生成“动态水印”(用户头像覆盖在另一张图像上)。我遇到的问题是我无法获得模型的“user_id
我想在我的图片上添加水印,这是我用来截图的代码。有人可以教我如何在图像中添加水印吗?我想在图片的右上角有一个小 Logo 。 我正在尝试研究是否可以实现我在 Canvas 中保留的内容,以便在截取屏幕
我有以下命令: ffmpeg -ss 00:00:30 -i "$i" -i ../audio.mov -map 0:0 -map 1:0 -to 30 -vf "fade=in:0:24, fade
我正在尝试从一些图片以及现有的 mp3(复制)制作幻灯片。图片尺寸不同,但我希望视频输出为 16:9 纵横比和 3840x2160。我也想要水印。重要的是不要拉伸(stretch)图片。 我试过这个代
我已经可以给任何 PDF 加水印,里面的图像,一切正常,但现在我只需要在打印 PDF 时才显示水印......这可能吗?如何? 我当然需要以编程方式执行此操作。 最佳答案 对于 future 的读者,
有没有办法在整个网页上创建浅色透明水印?一个留在屏幕上,即使它滚动?我的想法是创建一个 .PNG 位图并使用带有样式表的 DIV 标签,该样式表将我的 PNG 设置为背景图像,并设置绝对位置。问题是,
是否可以屏蔽应用程序的屏幕截图(电源 + 菜单按钮)?如果没有,此屏幕截图是否有可能收到水印? 问候,克劳迪奥 最佳答案 创建屏幕截图是一种系统行为,您不能覆盖它。 重复 Notification o
所以我一直在寻找如何为图像添加带有 colorBox 的水印,我在谷歌的第一个结果中找到了一个较旧的 colorBox 组,下一个答案是: Jack Moore 10/3/09 Ok, this sh
我有以下 CSS, #duplicateCopy { -webkit-transform:rotate(-20deg); -moz-transform:rotate(-20deg);
我有一个 pdf在它的背景上有水印。当开始扫描以在背景中突出显示带有水印或注释的任何单词时,它会被选中,因为它首先在触摸区域中找到。 我正在使用 CGPDFScanner 扫描文本。 我的问题是如何检
我正在寻找一种在选定字段上放置水印的方法。 那是行不通的-> [select* c_type class:ic watermark "choose type" "a" "b" "c"] 为了放置验证失
我正在尝试向视频添加各种 Gifs/水印,但我无法让它正常工作。 我们假设视频时长为 60 秒,我正在添加一张 Gif 图片。输出看起来正确,声音打开,gif 动画,视频没有停止。这是代码:
我正在尝试使用 FFmpeg 以编程方式将图像或视频叠加在另一个视频的顶部。似乎 AVFilter 可以做到这一点。 有很多关于如何使用命令行执行此操作或类似操作的示例,但是,除了 doc/examp
我正在尝试实现类似 StackOverflow 的水印功能。 我正在使用 jquery-watermark为了这。我遇到的问题是水印文本随着输入元素获得焦点而消失,这在 SO 中不会发生(我也不希望在
我是一名优秀的程序员,十分优秀!