golang 实现图片上绘制文字 + 图片水印
注:下面方法已封装扩展包,参考:https://www.cnblogs.com/xingzr/p/18655135
图片上绘制文字
package main
import (
"github.com/golang/freetype"
"image"
"image/draw"
"image/png"
"io/ioutil"
"log"
"os"
)
// TextInfo 文字信息
type TextInfo struct {
Text string // 文字内容
Size float64 // 文字大小
X int // 位置信息
Y int // 位置信息
}
// ImageInfo 图片信息
type ImageInfo struct {
Path string // 图片路径
Width int // 图片宽
Height int // 图片高
}
func main() {
imageInfo := ImageInfo{
Path: "in.png",
Width: 1000,
Height: 1000,
}
textInfo := []TextInfo{
{
Text: "测试文字1",
Size: 20,
X: 100,
Y: 200,
},
{
Text: "测试文字2",
Size: 30,
X: 500,
Y: 600,
},
}
err := ImageSeedText(imageInfo, textInfo, "font.ttf", "out.png")
if err != nil {
log.Fatalln(err)
}
}
func ImageSeedText(imageInfo ImageInfo, textInfo []TextInfo, fontPath string, outImagePath string) error {
// 生成画布
file, err := os.Open(imageInfo.Path)
if err != nil {
return err
}
defer file.Close()
img, _, err := image.Decode(file)
if err != nil {
return err
}
dst := image.NewRGBA(image.Rect(0, 0, imageInfo.Width, imageInfo.Height))
draw.Draw(dst, dst.Bounds(), img, img.Bounds().Min, draw.Over)
// 加载字体文件
fontBytes, err := ioutil.ReadFile(fontPath)
if err != nil {
return err
}
font, err := freetype.ParseFont(fontBytes)
if err != nil {
return err
}
// 生成文字信息
for _, v := range textInfo {
f := freetype.NewContext()
f.SetDPI(72)
f.SetFont(font) // 加载字体
f.SetFontSize(v.Size) // 设置字体尺寸
f.SetClip(dst.Bounds())
f.SetDst(dst)
f.SetSrc(image.Black) // 设置字体颜色
// 位置信息
pt := freetype.Pt(v.X, v.Y)
_, err = f.DrawString(v.Text, pt)
if err != nil {
return err
}
}
// 以png的格式写入文件
outFil, err := os.Create(outImagePath)
if err != nil {
return err
}
defer outFil.Close()
err = png.Encode(outFil, dst)
if err != nil {
return err
}
return nil
}
图片上添加水印
package main
import (
"bufio"
"image"
"image/draw"
"image/png"
"log"
"os"
)
func main() {
// 获取要打水印的目标图片
dest, err := os.Open("./dest.png")
if err != nil {
log.Fatalln(err)
}
defer dest.Close()
destImg, err := png.Decode(dest)
if err != nil {
log.Fatalln(err)
}
// 获取水印图片
watermark, err := os.Open("./watermark.png")
if err != nil {
log.Fatalln(err)
}
defer watermark.Close()
watermarkImg, err := png.Decode(watermark)
if err != nil {
log.Fatalln(err)
}
// 将水印图片放到目标图片上,当前将水印放到右下角,可根据需要自行调整
offset := image.Pt(destImg.Bounds().Dx()-watermarkImg.Bounds().Dx()-10, destImg.Bounds().Dy()-watermarkImg.Bounds().Dy()-10)
bb := destImg.Bounds()
m := image.NewRGBA(bb)
draw.Draw(m, bb, destImg, image.ZP, draw.Src)
draw.Draw(m, watermarkImg.Bounds().Add(offset), watermarkImg, image.ZP, draw.Over)
destImg = m
// 保存为新的图片
outFile, err := os.Create("./out.png")
defer outFile.Close()
if err != nil {
log.Fatalln(err)
}
b := bufio.NewWriter(outFile)
err = png.Encode(b, destImg)
if err != nil {
log.Fatalln(err)
}
}
分类:
golang
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!