Golang图片处理:学习如何添加水印和文字

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 库。希望这篇文章能够对您在开发中有所帮助。

后端开发标签