golang给图片加水印

发布时间:2024-11-23 16:16:45

在现代社交媒体充斥着图片的时代,给照片添加水印是一种常用的方法来保护个人版权和品牌。而使用golang来给图片加水印不仅简单高效,还可以方便地进行批量处理。本文将介绍如何利用golang给图片添加水印。

步骤一:安装相关库

首先,我们需要安装"golang.org/x/image"这个包,它提供了一些操作图像的功能。使用如下命令来安装该包:

go get golang.org/x/image

安装完毕后,我们就可以开始编写代码了。

步骤二:打开图片文件

在给图片加水印之前,我们首先需要打开要处理的图片文件,并读取其内容。使用如下代码来实现:

import (
	"image"
	"image/draw"
	_ "image/jpeg"
	"os"
)

func openImageFile(path string) (image.Image, error) {
	file, err := os.Open(path)
	if err != nil {
		return nil, err
	}

	defer file.Close()

	img, _, err := image.Decode(file)
	if err != nil {
		return nil, err
	}

	return img, nil
}

上述代码中,我们使用了"os"和"image"两个包来打开和解码图片文件。注意,我们没有指定文件格式,因为这个包会自动根据文件的扩展名来选择合适的解码器。

步骤三:添加水印

我们已经成功打开了要处理的图片文件,接下来就是将水印添加到图片上。以下是一个简单的函数,用于在图片的右下角添加文本水印:

import (
	"fmt"
	"image/color"
	"github.com/golang/freetype"
	"github.com/golang/freetype/truetype"
	"golang.org/x/image/font"
	"io/ioutil"
	"path/filepath"
)

func addTextWatermark(img image.Image, text string) (image.Image, error) {
	fontData, err := ioutil.ReadFile("font.ttf")
	if err != nil {
		return nil, err
	}

	font, err := freetype.ParseFont(fontData)
	if err != nil {
		return nil, err
	}

	bounds := img.Bounds()
	width := bounds.Dx()
	height := bounds.Dy()

	context := freetype.NewContext()
	context.SetDst(image.NewRGBA(bounds))
	context.SetSrc(img)
	context.SetDPI(72)
	context.SetFont(font)
	context.SetFontSize(48)
	context.SetClip(bounds)
	context.SetDst(image.NewUniform(color.RGBA{255, 255, 255, 255}))
	context.SetHinting(font.HintingFull)

	pt := freetype.Pt(width-300, height-50)
	_, err = context.DrawString(text, pt)
	if err != nil {
		return nil, err
	}

	return context.Image(), nil
}

上述代码中,我们使用了"github.com/golang/freetype"这个库来渲染文本水印。首先,我们需要加载一个TrueType字体文件,这里我们假设字体文件名为"font.ttf"。然后,我们创建了一个freetype.Context对象,设置了一些绘制文本所需的参数,比如字体、字号、位置等。最后,我们调用DrawString函数将文本渲染在图片上并返回处理后的图片。

至此,我们已经完成了所有的代码编写。接下来,我们可以使用以下代码测试上述函数:

func main() {
	img, err := openImageFile("input.jpg")
	if err != nil {
		fmt.Println(err)
		return
	}

	watermarkImg, err := addTextWatermark(img, "Watermark")
	if err != nil {
		fmt.Println(err)
		return
	}

	err = saveImage(watermarkImg, "output.jpg")
	if err != nil {
		fmt.Println(err)
		return
	}
}

在上述代码中,我们首先使用openImageFile函数打开了一个名为"input.jpg"的图片文件,然后调用addTextWatermark函数给图片添加了一个文本水印,最后将处理后的图片保存到"output.jpg"文件中。

运行上述代码后,你将会在当前目录下看到生成的"output.jpg"文件,其中包含了带有水印的图片。

综上所述,利用golang给图片加水印非常简单。通过安装"golang.org/x/image"包,我们可以轻松地打开和处理图片。通过使用"freetype"库,我们可以方便地在图片上添加文本水印。希望本文能对你有所帮助,谢谢阅读!

相关推荐