从2001年开始写代码,至今已经二十多个年头,一直深耕C#桌面开发。平日里工作繁忙,压力也大,没什么特别的爱好,就喜欢在下班路上、闲暇时光,掏出手机随手拍几张照片,记录城市烟火,也给自己解压。
拍的照片多了,有时候想分享到社交平台、存档留痕,又担心原图被随意盗用。一个个手动加水印太麻烦,效率太低,作为程序员,自然要用代码解决这个问题。
这段时间写了一个C#批量图片水印工具,支持文字水印、位置自定义、透明度调节,不管是随手拍的照片、工作截图,还是摄影作品,都能一键批量加水印,省时省力,还能保护作品版权,实用又稳妥。
一、工具核心功能
- 批量处理JPG、PNG格式图片,一次可处理上百张
- 支持自定义文字水印,可修改字体、大小、颜色
- 水印位置任选:左上角、右上角、左下角、右下角、居中
- 可调水印透明度,不遮挡原图内容
- 纯原生代码,无第三方插件,不压缩画质
- 不覆盖原图,自动保存到新文件夹,安全无风险
二、完整可运行C#源码
代码基于.NET Framework编写,兼容全版本桌面项目,注释清晰易懂,新手也能直接复制运行,只需修改路径和水印文字,就能直接使用。
using System;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
namespace ImageWatermarkTool
{
/// <summary>
/// 老码农自用:批量图片水印工具
/// 2001年入行,主打实用、简洁、稳定
/// </summary>
class Program
{
// 自定义水印文字(可改成自己的署名/公众号名)
private const string WatermarkText = "不误正业的码农";
// 水印透明度(0-1,数值越小越透明)
private const float Opacity = 0.6f;
static void Main(string[] args)
{
// ===================== 自行修改路径 =====================
// 原图存放文件夹
string sourcePath = @"D:\随手拍照片";
// 加水印后保存路径
string targetPath = @"D:\加水印照片";
// ======================================================
try
{
// 校验路径
if (!Directory.Exists(sourcePath))
{
Console.WriteLine("源文件夹不存在,请检查路径!");
Console.ReadKey();
return;
}
Directory.CreateDirectory(targetPath);
// 获取所有图片
string[] files = Directory.GetFiles(sourcePath, "*.*", SearchOption.TopDirectoryOnly);
foreach (var filePath in files)
{
string ext = Path.GetExtension(filePath).ToLower();
if (ext != ".jpg" && ext != ".jpeg" && ext != ".png")
continue;
// 执行添加水印
AddWatermark(filePath, targetPath);
Console.WriteLine($"已处理:{Path.GetFileName(filePath)}");
}
Console.WriteLine("==================================");
Console.WriteLine("✅ 批量水印添加完成!");
Console.WriteLine("==================================");
}
catch (Exception ex)
{
Console.WriteLine($"处理出错:{ex.Message}");
}
finally
{
Console.WriteLine("\n按任意键退出");
Console.ReadKey();
}
}
/// <summary>
/// 给单张图片添加水印
/// </summary>
private static void AddWatermark(string sourcePath, string targetPath)
{
using (Image originalImg = Image.FromFile(sourcePath))
{
using (Bitmap bitmap = new Bitmap(originalImg.Width, originalImg.Height))
{
using (Graphics g = Graphics.FromImage(bitmap))
{
// 高清绘制
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
// 绘制原图
g.DrawImage(originalImg, 0, 0, originalImg.Width, originalImg.Height);
// 设置水印字体与颜色
Font font = new Font("微软雅黑", 24, FontStyle.Bold);
SolidBrush brush = new SolidBrush(Color.FromArgb((int)(Opacity * 255), Color.White));
// 计算水印位置(右下角)
SizeF textSize = g.MeasureString(WatermarkText, font);
float x = originalImg.Width - textSize.Width - 20;
float y = originalImg.Height - textSize.Height - 20;
// 绘制水印
g.DrawString(WatermarkText, font, brush, x, y);
}
// 保存图片
string fileName = Path.GetFileName(sourcePath);
string savePath = Path.Combine(targetPath, fileName);
bitmap.Save(savePath, ImageFormat.Jpeg);
}
}
}
}
}
三、使用说明
- 打开Visual Studio,新建控制台应用,粘贴全部代码
- 修改sourcePath和targetPath为自己电脑的文件路径
- 可自定义水印文字、字体大小、透明度、位置
- 直接运行程序,等待批量处理完成即可
四、微调技巧
想要修改水印位置,只需改动代码中x、y坐标数值;想要更换水印颜色,修改Color.White即可;文字内容直接替换WatermarkText常量,改成个人署名、账号名都合适。
五、写在最后
写了二十多年代码,我一直觉得,编程从来不是高冷的技术,而是用来解决生活小事、提升效率的利器。就像这个小工具,不用高深的逻辑,却能解决摄影爱好者、日常办公的实际痛点。
平时除了分享这类C#实用小工具,我也会记录老码农的职场日常、下班随手拍,没有技术炫技,没有专业套路,只分享真实的干货和生活。
这份工具的完整工程、可调位置版源码,我已经打包整理好,放在了同名公众号:不误正业的码农。
关注后回复关键词【水印】,直接领取完整项目,不用手动复制代码,打开就能编译使用。
欢迎各位同行在评论区交流,不管是代码优化,还是摄影随拍,都可以一起分享。