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

如何使用fogleman/gg设置文本透明度实现半透明图片水印?

如何用fogleman/gg实现半透明文本水印

核心问题解决

你的实色水印遮挡图片内容的原因是颜色的Alpha通道设为了完全不透明(255)。只需调整RGBA颜色的最后一个参数(Alpha值),就能让文本水印变为半透明,下方图片内容即可透过水印正常显示。

修改后的代码

import (
    "image"
    "image/color"
    "strings"

    "github.com/fogleman/gg"
    "github.com/pkg/errors"
)

func setImgWatermark(img image.Image, text string) (image.Image, error) {
    dc := gg.NewContextForImage(img)
    if err := dc.LoadFontFace(fontPath, 100.0); err != nil {
        return nil, errors.Wrap(err, "dc.LoadFontFace")
    }

    // 调整Alpha值实现半透明,示例设为64(约25%不透明度,数值越小越透明)
    dc.SetColor(color.RGBA{158, 158, 158, 64})

    x, y := float64(dc.Width()/2), 0.0
    dc.Translate(x, y)
    dc.Rotate(gg.Radians(-45))
    dc.DrawStringAnchored(strings.Repeat(text, 5), x, y, 0.5, 0.5)

    return dc.Image(), nil
}

关键说明

  • color.RGBA的第四个参数是Alpha通道,取值范围为0-255:
    • 0:完全透明
    • 255:完全不透明
    • 可根据需求调整数值,比如设为128对应50%不透明度
  • 注意修正原代码中import (]的语法错误,改为import (,否则会编译失败

补充:渐变水印结合透明度

如果需要用渐变作为水印颜色并保留透明度,可以通过CreateLinearGradient创建渐变后,给渐变的颜色节点设置带Alpha的颜色:

// 创建从左上到右下的线性渐变
grad := dc.CreateLinearGradient(0, 0, float64(dc.Width()), float64(dc.Height()))
// 添加带透明度的颜色节点
grad.AddColorStop(0, color.RGBA{158, 158, 158, 80})
grad.AddColorStop(1, color.RGBA{100, 100, 100, 40})
// 使用渐变作为填充颜色
dc.SetFillStyle(grad)
dc.DrawStringAnchored(strings.Repeat(text, 5), x, y, 0.5, 0.5)

内容的提问来源于stack exchange,提问作者Sebastian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:09:57