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. 其他说明
- 要用参数需要指定字体文件的位置,我这里simsun.ttf是宋体,必须使用支持中文的字体。如果怕麻烦,可以下载我这里使用的宋体simsun.ttf,把simsun.ttf放到和代码同目录下。simsun.ttf下载
4. 参考资料
关于如何在图片上添加文字,这个我也是找了很久,看到stackoverflow上一篇回答,但是这篇回答只提供了大概的思路,并没有具体的代码,我这里把它实现了。
- https://stackoverflow.com/questions/38299930/how-to-add-a-simple-text-label-to-an-image-in-go
- https://github.com/golang/freetype/blob/master/example/freetype/main.go