C# 给图片添加文字水印

目录

应用场景

开发运行环境

方法说明

方法代码

调用示例 

小结


应用场景

在某些应用项目(如电子档案信息管理)中,查看电子图片信息是经常使用到的功能,此时我们就需要给显示在浏览器中的图片添加文字水印版权或提示信息。增加水印主要起到如下作用:

1、防止盗图:图片加水印可以有效防止盗图,将文字水印嵌入到图片中作为特殊标记,可以在不影响图片质量的情况下保护版权,即使别人下载了图片,也可以通过水印追踪到图片的来源。

2、增加宣传效果:可以通过添加URL或其它宣传性文字,增加宣传效果。

开发运行环境

操作系统: Windows Server 2019 DataCenter

.net版本: .netFramework4.0 或以上

开发工具:VS2019  C#

方法说明

AddWaterText 方法无返回值,具体参数说明请参照下表:

序号参数名类型说明
1oldpathstring原图片文件路径
2textstring要添加的水印文字
3newpathstring新输出图片文件路径
4pointobject设置文字起始位置坐标
5fontSystem.Drawing.Font设置文字的字体
6colorSystem.Drawing.Color

设置文字的颜色

可使用 System.Drawing.Color.FromArgb(alpha, r, g, b)方法添加滤镜效果

7rotatefloat旋转角度值,默认值为 0.0f
8textWidthint文本预估宽度,默认值为1
9textHeightint文本预估高度,默认值为1
10repeatDint多水印文本间距值,默认值为0

方法代码

public void AddWaterText(string oldpath, string text, string newpath, object point, System.Drawing.Font font, System.Drawing.Color color, float rotate = 0.0f, int textWidth = 1,int textHeight=1, int repeatD=0){try{FileStream fs = new FileStream(oldpath, FileMode.Open);BinaryReader br = new BinaryReader(fs);byte[] bytes = br.ReadBytes((int)fs.Length);br.Close();fs.Close();MemoryStream ms = new MemoryStream(bytes);System.Drawing.Image imgPhoto = System.Drawing.Image.FromStream(ms);int imgPhotoWidth = imgPhoto.Width;int imgPhotoHeight = imgPhoto.Height;Bitmap bmPhoto = new Bitmap(imgPhotoWidth, imgPhotoHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);bmPhoto.SetResolution(72, 72);Graphics gbmPhoto = Graphics.FromImage(bmPhoto);gbmPhoto.Clear(Color.FromName("white"));gbmPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;gbmPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;gbmPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, imgPhotoWidth, imgPhotoHeight), 0, 0, imgPhotoWidth, imgPhotoHeight, GraphicsUnit.Pixel);System.Drawing.SizeF crSize = new SizeF();crSize = gbmPhoto.MeasureString(text, font);float y = imgPhotoHeight - crSize.Height;float x = imgPhotoWidth - crSize.Width;System.Drawing.StringFormat StrFormat = new System.Drawing.StringFormat();StrFormat.Alignment = System.Drawing.StringAlignment.Center;if(point!=null){System.Drawing.Point newpos=((System.Drawing.Point)point);x=newpos.X;y=newpos.Y;}System.Drawing.SolidBrush semiTransBrush = new System.Drawing.SolidBrush(color);System.Drawing.Color.FromArgb(1,1,1,1);gbmPhoto.RotateTransform(rotate);if (repeatD == 0){gbmPhoto.DrawString(text, font, semiTransBrush, x, y);}else{int xcount = imgPhotoWidth/textWidth+3;int ycount = imgPhotoHeight/textHeight+3;float ox = x;for (int k = 0; k < ycount; k++){for (int i = 0; i < xcount; i++){for (int j = 0; j < xcount; j++){gbmPhoto.DrawString(text, font, semiTransBrush, x, y);}x += textWidth+repeatD;}x = ox;y += textHeight+repeatD;}}bmPhoto.Save(newpath, System.Drawing.Imaging.ImageFormat.Jpeg);gbmPhoto.Dispose();imgPhoto.Dispose();bmPhoto.Dispose();}catch{               ;               }}

调用示例 

//获取源图片文件路径
string tempfile=Request.PhysicalApplicationPath+"\\app_data\\test.jpg";
//设置文字位置
System.Drawing.Point point = new System.Drawing.Point();
point.X = -10;
point.Y = -100;
//设置字体类
System.Drawing.Font font = new System.Drawing.Font("微软雅黑", 19, System.Drawing.FontStyle.Bold);
//设置字体滤镜值 ,和RGB分量颜色
int alpha = 25; int r = 255; int g = 0; int b = 255;
System.Drawing.Color color = System.Drawing.Color.FromArgb(alpha, r, g, b);float rotate=30.0f; // 旋转角度
int textWidth = 100; //文本预估宽度
int textHeight=30; //文本预估高度
int repeatD=100; // 多水印文本间距,则表示多水印输出//添加水印文字
string text="版权所有";
AddWaterText(tempfile,text,tempfile, point, font, color,rotate,textWidth,textHeight,repeatD);File.Delete(tempfile);  //删除释放文件,在些之前可执行显示操作,如获取base64编码

显示效果如下图:

小结

AddWaterText 方法需要根据您实际应用中的图片大小动态调整参数,以达到满意的显示效果,如果文字起始位置,字体大小,水印间距等。您也可以改造本方法或应用,自动适应调整参数值。

调用示例中新旧图片文件输出为同一文件,然后删除释放文件所占用磁盘的空间,因此我们想要正确显示图片在浏览器的话,需要在删除文件前获取图片的Base64编码即可,如何获取base64数据的方法请参照我的文章:《C# 自动填充文字内容到指定图片》

感谢您的阅读,希望本文能够对您有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/3284.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

石家庄学院2023年大学生程序设计大赛题解

A、大臣的旅费 floyd求最短路径 #include <iostream>using namespace std;int d[1005][1005]; int n; int res;int f(int x) {// 等差数列return ((11 x 10) * x) / 2; }void init() {for (int i 1; i < n; i) {for (int j 1; j < n; j) {if (i j) d[i][j] …

Golang对接Ldap(保姆级教程:概念搭建实战)

Golang对接Ldap&#xff08;保姆级教程&#xff1a;概念&搭建&实战&#xff09; 最近项目需要对接客户的LDAP服务&#xff0c;于是趁机好好了解了一下。LDAP实际是一个协议&#xff0c;对应的实现&#xff0c;大家可以理解为一个轻量级数据库。用户查询。比如&#xff…

各种类型游戏的乐趣与魅力

游戏已经成为人们生活中不可或缺的一部分。从家庭娱乐到专业电竞&#xff0c;游戏行业呈现出多姿多彩的景象&#xff0c;吸引着亿万玩家的目光。而游戏的多样性正是其中一大魅力所在。让我们一起探索各种类型游戏的乐趣与魅力吧&#xff01; 动作游戏&#xff1a; 动作游戏以快…

力扣HOT100 - 114. 二叉树展开为链表

解题思路&#xff1a; class Solution {List<TreeNode> list new ArrayList<>();public void flatten(TreeNode root) {recur(root);for (int i 1; i < list.size(); i) {TreeNode pre list.get(i - 1);TreeNode cur list.get(i);pre.left null;pre.right…

使用Shell终端访问Linux

一、实验目的 1、熟悉Linux文件系统访问命令&#xff1b; 2、熟悉常用 Linux Shell的命令&#xff1b; 3、熟悉在Linux文件系统中vi编辑器的使用&#xff1b; 4、进一步熟悉虚拟机网络连接模式与参数配置&#xff01; 二、实验内容 1、使用root帐号登陆到Linux的X-windows…

【Qt 学习笔记】Qt常用控件 | 输入类控件 | Combo Box的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 输入类控件 | Combo Box的使用及说明 文章编号&#xff…

【Qt 学习笔记】Qt常用控件 | 显示类控件 | LCD Number的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 显示类控件 | LCD Number的使用及说明 文章编号&#xf…

梳理 Pytorch 19个方面,70个核心操作全总结!

最新写了很多关于 Pytorch 的文章&#xff0c;喜欢可以从0开始学习&#xff1a; 小白学 PyTorch 系列&#xff1a;这一次&#xff0c;我准备了 20节 PyTorch 中文课程小白学 PyTorch 系列&#xff1a;54个超强 pytorch 操作小白学 PyTorch 系列&#xff1a;9个技巧让你的 PyTo…

wps屏幕录制怎么用?分享使用方法!

数字化时代&#xff0c;屏幕录制已成为我们学习、工作和娱乐中不可或缺的一部分。无论是制作教学视频、分享游戏过程&#xff0c;还是录制网络会议&#xff0c;屏幕录制都能帮助我们轻松实现。WPS作为一款功能强大的办公软件&#xff0c;其屏幕录制功能也备受用户青睐。本文将详…

代码随想录:二叉树15-17

目录 404.左叶子之和 题目 代码&#xff08;后序递归&#xff09; 代码&#xff08;前序迭代&#xff09; 513.找树左下角的值 题目 代码&#xff08;层序迭代&#xff09; 112.路径总和 题目 代码&#xff08;前序迭代&#xff09; 112.路径总和II 题目 代码&…

记录如何用php将多个字符替换成同一个字符

在PHP中&#xff0c;如果你想要将多个不同的字符替换成同一个字符&#xff0c;可以使用str_replace()函数。这个函数可以接收一个包含需要被替换的字符的数组&#xff0c;以及一个表示替换目标的字符串。 以下是使用str_replace()进行多字符替换的基本示例&#xff1a; $text…

Linux读写文件

前言 学习了文件系统&#xff0c;就能理解为什么说Linux下一切皆文件。 语言层面的操作 在c语言的学习中我们可以使用fopen()函数对文件进行操作。 int main() {//FILE * fp fopen("./log.txt", "w");//FILE * fp fopen("./log.txt", "…

TablePlus for Mac/Win:开启高效数据开发新纪元

在当今数字化时代&#xff0c;数据的重要性日益凸显。无论是企业还是个人&#xff0c;都需要一款强大而实用的本地原生数据开发软件来提升工作效率。而 TablePlus for Mac/Win 正是这样一款卓越的工具&#xff0c;它为用户带来了全新的体验&#xff0c;让数据开发变得更加轻松、…

第1次作业

目录 重点内容提要一、误差度量二、浮点数系统三、误差传播四、数值稳定性 作业解析 重点内容提要 一、误差度量 二、浮点数系统 三、误差传播 四、数值稳定性 作业解析

快速部署 Garnet

快速部署 Garnet Garnet 是 Microsoft Research 推出的一种新型远程缓存存储&#xff0c;其设计速度极快、可扩展且延迟低。 Garnet 在单个节点内是线程可扩展的。它还支持分片集群执行、复制、检查点、故障转移和事务。它可以在主内存以及分层存储&#xff08;例如 SSD 和 Az…

2024/4/25 红外遥控代码

51完结撒花&#xff01;&#xff01;&#xff01; 这块如果IR听不懂可以看看那个状态机的相关视频。 Int0.c #include <REGX52.H>void Int0_Init(void) {IT01;IE00;EX01;EA1;PX01; }//void Int0_Routine(void) interrupt 0 //{ // Num; //} Timer0.c #include …

C#中=> “Lambda运算符”

在C#中&#xff0c;> 符号被称为“Lambda运算符”或“Lambda箭头”。它用于连接Lambda表达式中的参数列表和表达式主体&#xff0c;表示函数的输入和输出关系。因此&#xff0c;Lambda运算符充当了将参数映射到表达式的箭头。 Lambda运算符的左侧是参数列表&#xff0c;它们…

GRASSHOPPER电池Expression

Grasshopper中如果要实现简单的条件if语句的效果&#xff0c;可以使用电池Expression。 举例&#xff1a;获取两个数的差值&#xff0c;永远用大数减去小数

代码随想录算法训练营day45

70. 爬楼梯 &#xff08;进阶&#xff09; 五部曲&#xff1a; dp数组下标及含义&#xff1a;爬到有i个台阶的楼顶&#xff0c;有dp[i]种方法dp数组初始化&#xff1a;dp[0]1递推公式&#xff1a;dp[i] dp[i - j]遍历方向&#xff1a;target放在外循环&#xff0c;将nums放在…

OpenUI在windows下部署使用

OpenUI OpenUI是一个基于Python的AI对话平台&#xff0c;支持接入多种AI模型。 通过聊天的方式来进行UI设计&#xff0c;你可以通过文字来描述你想要的UI界面&#xff0c;OpenUI可以帮你实时进行渲染出效果 安装OpenUI 这里预设你的电脑上已安装git、Python和pip&#xff0…