1. 前言
图片处理是现今互联网开发重要的方向。图片处理包括缩放、裁剪、添加水印等。在本文中,我们将学习如何使用Golang对图片进行水印和文字的添加。
2. 准备工作
2.1 安装go
如果您还未安装Go,请先前往 https://golang.org/dl/ 下载并安装Golang。
2.2 安装相关库
在进行图片处理之前,我们需要安装相关库。
go get -u github.com/nfnt/resize
go get github.com/disintegration/imaging
go get github.com/golang/freetype
以上三个库分别用于图片缩放、图片处理和文字添加。
3. 添加水印
3.1 添加图片水印
首先,我们先下载一张测试图片 https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_1280.jpg。
接着,我们定义一个函数处理图片:
package main
import (
"image"
"image/draw"
"image/jpeg"
"os"
)
func addWatermark(srcPath, dstPath string, watermark image.Image) error {
// 打开图片文件
imgFile, err := os.Open(srcPath)
if err != nil {
return err
}
defer imgFile.Close()
// 解码图像
img, _, err := image.Decode(imgFile)
if err != nil {
return err
}
// 新建一个RGBA图像
rgbaImg := image.NewRGBA(img.Bounds())
draw.Draw(rgbaImg, rgbaImg.Bounds(), img, image.Point{0, 0}, draw.Src)
// 添加水印
offset := image.Pt(rgbaImg.Bounds().Max.X-watermark.Bounds().Dx()-10, rgbaImg.Bounds().Max.Y-watermark.Bounds().Dy()-10)
draw.Draw(rgbaImg, watermark.Bounds().Add(offset), watermark, image.Point{0, 0}, draw.Over)
// 保存水印图片
imgDst, err := os.Create(dstPath)
if err != nil {
return err
}
defer imgDst.Close()
jpeg.Encode(imgDst, rgbaImg, &jpeg.Options{Quality: 80})
return nil
}
运行以下代码添加水印:
func main() {
// 读取水印图片
watermarkFile, err := os.Open("watermark.png")
if err != nil {
panic(err)
}
defer watermarkFile.Close()
watermarkImg, err := png.Decode(watermarkFile)
if err != nil {
panic(err)
}
// 添加水印
err = addWatermark("test.jpg", "withWatermark.jpg", watermarkImg)
if err != nil {
panic(err)
}
}
上述代码中,addWatermark()函数用于将水印添加到图片上,其中srcPath为源图片路径,dstPath为生成图片路径,watermark为水印图片。
3.2 添加文字水印
我们也可以将文字作为水印添加到图片中。下面的代码用于实现添加文字水印:
func addTextWatermark(srcPath, dstPath, text string) error {
// 打开图片文件
imgFile, err := os.Open(srcPath)
if err != nil {
return err
}
defer imgFile.Close()
// 解码图像
img, _, err := image.Decode(imgFile)
if err != nil {
return err
}
// 新建一个RGBA图像
rgbaImg := image.NewRGBA(img.Bounds())
draw.Draw(rgbaImg, rgbaImg.Bounds(), img, image.Point{0, 0}, draw.Src)
// 添加文字水印
c := freetype.NewContext()
c.SetDPI(72)
c.SetFont(freetype.Must(freetype.ParseFont(fontData)))
c.SetFontSize(36)
c.SetClip(rgbaImg.Bounds())
c.SetDst(rgbaImg)
c.SetSrc(image.NewUniform(color.RGBA{0, 0, 0, 128}))
pt := freetype.Pt(rgbaImg.Bounds().Dx()-c.PointToFixed(10)>>6, rgbaImg.Bounds().Dy()-c.PointToFixed(10)>>6)
_, err = c.DrawString(text, pt)
if err != nil {
return err
}
// 保存文字水印图片
imgDst, err := os.Create(dstPath)
if err != nil {
return err
}
defer imgDst.Close()
err = jpeg.Encode(imgDst, rgbaImg, &jpeg.Options{Quality: 80})
return err
}
下面的代码用于运行 addTextWatermark()函数,添加文字水印到图片中:
func main() {
// 添加文字水印
err := addTextWatermark("test.jpg", "withTextWatermark.jpg", "Golang图片处理文章的水印")
if err != nil {
panic(err)
}
}
4. 总结
在本文中,我们学习了如何使用Golang对图片添加水印和文字。要添加水印,我们需要使用 github.com/disintegration/imaging 库; 要添加文字水印,我们需要使用 github.com/golang/freetype 库。希望这篇文章能够对您在开发中有所帮助。