Go语言如何在图片上添加中文

1. 效果展示

下面是原图:
在这里插入图片描述
下面是添加了文字的图片:
在这里插入图片描述

2. 实现代码

我把给图片添加文字的代码封装到了一个函数addLabel里面,具体代码如下:

func addLabel(img image.Image, label string, x, y int, fontColor color.Color, size float64, fontPath string) (image.Image, error) {
	bound := img.Bounds()
	// 创建一个新的图片
	rgba := image.NewRGBA(image.Rect(0, 0, bound.Dx(), bound.Dy()))
	// 读取字体
	fontBytes, err := ioutil.ReadFile(fontPath)
	if err != nil {
		return rgba, err
	}
	myFont, err := freetype.ParseFont(fontBytes)
	if err != nil {
		return rgba, err
	}

	draw.Draw(rgba, rgba.Bounds(), img, bound.Min, draw.Src)
	c := freetype.NewContext()
	c.SetDPI(72)
	c.SetFont(myFont)
	c.SetFontSize(size)
	c.SetClip(rgba.Bounds())
	c.SetDst(rgba)
	uni := image.NewUniform(fontColor)
	c.SetSrc(uni)
	c.SetHinting(font.HintingNone)

	// 在指定的位置显示
	pt := freetype.Pt(x, y+int(c.PointToFixed(size)>>6))
	if _, err := c.DrawString(label, pt); err != nil {
		return rgba, err
	}

	return rgba, nil
}

然后在主函数读取一张图片,然后调用addLabel函数:

func main() {
	src, err := os.Open("Blue.jpg")
	if err != nil {
		log.Println(err)
		return
	}
	img, err := jpeg.Decode(src)
	if err != nil {
		log.Println(err)
		return
	}
	// 给图片添加文字,这里要指定字体文件的路径
	// 这里我使用的是simsun.ttf是宋体
	// 这里换成你自己电脑上的字体文件
	outimage, err := addLabel(img, "你好,世界", 100, 100, color.RGBA{0, 0, 0, 255}, 500, "simsun.ttf")

	if err != nil {
		log.Println(err)
		return
	}

	f, err := os.Create("outimage.png")
	if err != nil {
		log.Println(err)
		return
	}
	defer f.Close()

	err = png.Encode(f, outimage)
	if err != nil {
		log.Println(err)
		return
	}
}
2.1 参数说明

我这里封装的函数有多个参数,这里对参数进行解释:

addLabel(img image.Image, label string, x, y int, fontColor color.Color, size float64, fontPath string) (image.Image, error)
参数说明:
	img: 原图片
	label: 要添加的文字
	x, y: 文字在图片所在的位置
	fontColor: 文字颜色
	size: 文字大小
	fontPath: 指定字体的位置,这里要注意,正是这个指定字体,中文才不会乱码
返回值:
	image.Image:是添加文字之后的图片
	err: 产生的错误

3. 其他说明

  1. 要用参数需要指定字体文件的位置,我这里simsun.ttf是宋体,必须使用支持中文的字体。如果怕麻烦,可以下载我这里使用的宋体simsun.ttf,把simsun.ttf放到和代码同目录下。simsun.ttf下载

4. 参考资料

关于如何在图片上添加文字,这个我也是找了很久,看到stackoverflow上一篇回答,但是这篇回答只提供了大概的思路,并没有具体的代码,我这里把它实现了。

  1. https://stackoverflow.com/questions/38299930/how-to-add-a-simple-text-label-to-an-image-in-go
  2. https://github.com/golang/freetype/blob/master/example/freetype/main.go
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值