2001年入行老码农:C#批量给照片加水印,保护随手拍作品

0 阅读4分钟

从2001年开始写代码,至今已经二十多个年头,一直深耕C#桌面开发。平日里工作繁忙,压力也大,没什么特别的爱好,就喜欢在下班路上、闲暇时光,掏出手机随手拍几张照片,记录城市烟火,也给自己解压。

微信图片_20260327083710_500_174.jpg

拍的照片多了,有时候想分享到社交平台、存档留痕,又担心原图被随意盗用。一个个手动加水印太麻烦,效率太低,作为程序员,自然要用代码解决这个问题。

这段时间写了一个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);
                }
            }
        }
    }
}

三、使用说明

  1. 打开Visual Studio,新建控制台应用,粘贴全部代码
  2. 修改sourcePath和targetPath为自己电脑的文件路径
  3. 可自定义水印文字、字体大小、透明度、位置
  4. 直接运行程序,等待批量处理完成即可

四、微调技巧

想要修改水印位置,只需改动代码中x、y坐标数值;想要更换水印颜色,修改Color.White即可;文字内容直接替换WatermarkText常量,改成个人署名、账号名都合适。

微信图片_20260327083706_496_174.jpg

五、写在最后

写了二十多年代码,我一直觉得,编程从来不是高冷的技术,而是用来解决生活小事、提升效率的利器。就像这个小工具,不用高深的逻辑,却能解决摄影爱好者、日常办公的实际痛点。

平时除了分享这类C#实用小工具,我也会记录老码农的职场日常、下班随手拍,没有技术炫技,没有专业套路,只分享真实的干货和生活。

这份工具的完整工程、可调位置版源码,我已经打包整理好,放在了同名公众号:不误正业的码农

关注后回复关键词【水印】,直接领取完整项目,不用手动复制代码,打开就能编译使用。

欢迎各位同行在评论区交流,不管是代码优化,还是摄影随拍,都可以一起分享。