如何在C#中为流处理的图片添加日期水印?
为流中图片添加日期水印的实现方案
你可以在注释标记的位置插入Graphics相关代码,直接在缩放后的Bitmap上绘制日期水印,无需依赖文件路径。以下是修改后的完整代码:
private byte[] toBytes(Image image) { Bitmap resized = new Bitmap(image, 1000, 750); MemoryStream ms = new MemoryStream(); // 在这里添加日期水印绘制逻辑 using (Graphics g = Graphics.FromImage(resized)) { // 设置水印字体、颜色(半透明白色,避免遮挡主体) Font font = new Font("Arial", 16, FontStyle.Bold); Color textColor = Color.FromArgb(180, 255, 255, 255); // 180是透明度,范围0-255 // 设置文本居中对齐 StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Center; // 要绘制的日期文本,这里用当前时间,若需原始拍摄时间可读取图片EXIF信息 string dateText = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // 计算水印位置:底部居中,距离底部30像素 float x = resized.Width / 2; float y = resized.Height - 30; // 绘制文本 g.DrawString(dateText, font, new SolidBrush(textColor), x, y, sf); } resized.Save(ms, ImageFormat.Jpeg); resized.Dispose(); return ms.ToArray(); }
关键说明:
- 使用
using语句包裹Graphics对象,确保自动释放资源,避免内存泄漏 - 颜色使用
Color.FromArgb设置半透明,既保留水印可读性又不遮挡图片内容 - 若需要添加图片原始拍摄时间而非当前时间,可以读取图片的EXIF元数据,示例代码如下:
// 从图片EXIF中获取原始拍摄日期 string originalDate = null; foreach (PropertyItem propItem in image.PropertyItems) { // PropertyTagId=36867对应EXIF的DateTimeOriginal字段 if (propItem.Id == 36867) { originalDate = System.Text.Encoding.UTF8.GetString(propItem.Value).Trim('\0'); break; } } // 若读取到原始日期则使用,否则用当前时间 string dateText = string.IsNullOrEmpty(originalDate) ? DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") : originalDate;
注意事项:
- 可根据图片尺寸调整字体大小、水印位置(比如修改
y值调整上下距离) - 若图片底色较浅,可将文本颜色改为半透明黑色(
Color.FromArgb(180, 0, 0, 0))提升可读性
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

