You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:47:49