C# 使用 System.Drawing 实现图片添加水印与缩放剪切实例
在 C# 开发中,经常需要为上传的图片自动添加版权水印或生成预览缩略图。本文将提供一个完整的 ImgWater 辅助类示例,涵盖图片水印(含透明度与边距控制)、文字水印(自适应字体大小)以及图像缩放与裁剪等核心图像处理操作。
准备工作与依赖
本方案基于 .NET Framework 环境下的 System.Drawing 命名空间。在使用以下代码前,请确保项目中已引用该库。对于涉及文件写入的操作,需保证运行账户具备对应目录的读写权限。
第1步:定义 ImgWater 类结构
创建一个名为 ImgWater 的公共类,内部封装了各个图像处理的具体方法。以下是该类所需的命名空间引入:
using System;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
图片水印处理
图片水印常用于品牌标识叠加。本方法通过计算水印图与原图的尺寸比例,自动调整水印大小,并利用色彩矩阵实现透明度混合。
第2步:调用 zzsImgWater 方法
目的:将指定的水印图片合成到原图右下角区域。
重要参数:
ImgFile: 原始图片路径。WaterImg: 水印图片路径。sImgPath: 处理后图片的保存路径。Alpha: 水印透明度系数(0.0-1.0)。iScale: 水印占原图宽度的比例基准。intDistance: 距离图片边缘的最小像素间距。
第3步:核心逻辑解析
算法首先读取原图和水印图,根据预设比例计算新的水印尺寸。若水印过大,则按 iScale 缩小;若过小且符合范围,则保持原长宽比缩放。合成时,通过 ImageAttributes 设置颜色矩阵:colorMatrixElements 中的第四行第四列即为 Alpha 通道值,用于控制透明效果。
- 加载图像并获取宽高。
System.Drawing.Image imgPhoto = System.Drawing.Image.FromFile(ImgFile); - 创建画布并锁定分辨率。
bmPhoto.SetResolution(72, 72); - 绘制原图到内存位图,再创建水印图层副本。
- 配置透明度矩阵:
imageAttributes.SetColorMatrix(wmColorMatrix, ...); - 确定坐标并进行合成绘制:
gWatermark.DrawImage(imgWatermark, rect, ..., imageAttributes); - 以 Jpeg 格式保存结果并释放资源。
文字水印处理
除了 Logo 图片,直接打印文本也是常见的防伪手段。该方法会自动根据文字长度动态选择最大的合适字号。
第4步:调用 zzsTextWater 方法
入口:通过类实例化调用 zzsTextWater。
参数说明:
TextFont: 要显示的水印文字内容。hScale: 垂直位置比例(参考底部)。widthFont: 文字宽度占比限制。Alpha: 文字的透明度(0-255)。
第5步:字体自适应算法
代码中包含了一个从大到小的字号数组 { 28, 26, 24, 20, 16, 14, 12 }。系统会遍历此数组,使用 MeasureString 测算文字在图形上下文中的实际占据宽度。一旦实测宽度小于原图宽度的指定比例 widthFont,循环终止,选中该字号以确保水印既显眼又不遮挡主体。
组合水印与高级裁剪
组合水印:zzsImgTextWater 方法结合了上述两者的逻辑,先在指定坐标画出文字,再叠加图片水印。注意其默认水平居中,垂直高度可由参数调整。
第6步:缩略图与裁剪操作
缩略图 (zzsResizeImg):支持指定目标宽和高,以及背景色(如黑色或白色)。当原图无法完全填满目标区域时,会在剩余部分填充设定背景色,并保持长宽比不变形。
裁剪 (zzsCutImg):提取原图的特定矩形区域。需注意参数顺序,避免混淆坐标与尺寸。
完成判断与注意事项
完成判断:当方法返回 true 时,表示图片已成功保存至 sImgPath 指定的路径。若发生文件被占用或路径无效异常,返回 false。
- 资源释放:所有绘图操作务必在末尾调用
Dispose()销毁Graphics、Bitmap和Image对象,防止内存泄漏。 - 格式锁定:代码中固定使用
ImageFormat.Jpeg保存,如需 PNG 支持透明通道,可修改此处格式定义。
以上就是C#给图片添加水印及处理的详细内容,更多关于C#图像处理与编程实践的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









