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)
	}
}
posted @   元気田支店长  阅读(716)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示