如何使用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
相关产品推荐
相关产品推荐

