发布时间:2024-12-23 03:45:06
图片加水印是一个常见的需求,特别在一些需要保护版权或者防止盗用的场合,给图片添加水印可以有效地防止他人恶意使用图片。在golang中,我们可以通过一些库和技术实现图片加水印的功能。
Golang提供了一些用于操作图片的库,例如"image"和"image/draw"包,这些包允许我们读取、写入和处理各种格式的图片。首先,我们需要导入这些包:
import (
"image"
"image/draw"
_ "image/gif"
_ "image/jpeg"
_ "image/png"
"os"
)
通过使用以上包,我们可以轻松地将图片加载到内存中,并对其进行各种操作,如调整大小、旋转、裁剪等。
要给图片添加水印,首先我们需要创建一个水印图像。我们可以使用原始图片的尺寸来决定水印的大小和位置,也可以根据需求自定义水印的属性。以下是一个示例函数用于生成水印图片:
func generateWatermark(width, height int, text string) *image.RGBA {
// 创建一个新的RGBA图像
m := image.NewRGBA(image.Rect(0, 0, width, height))
// 设置水印文字的属性
c := freetype.NewContext()
c.SetDPI(72)
c.SetFont(font) // 自定义字体
c.SetFontSize(36)
c.SetClip(m.Bounds())
c.SetDst(m)
c.SetSrc(image.Black)
// 计算水印文本的位置
pt := freetype.Pt((width-int(tempWidth))/2, (height+int(tempHeight))/2)
// 绘制水印
_, err := c.DrawString(text, pt)
if err != nil {
log.Println(err)
}
return m
}
在这个函数中,我们使用了一个自定义的RGBA图像来创建水印。然后,我们设置了水印文字的属性,例如字体、大小、颜色等。使用给定的宽度和高度计算出水印文本的位置,并将水印绘制到图像上。
有了水印图像,我们就可以将其叠加到原始图片上了。以下是一个示例函数用于给图片添加水印:
func addWatermarkToImage(originalImage image.Image, watermarkImage image.Image, outputFilePath string) error {
// 创建一个新的RGBA图像
rgba := image.NewRGBA(originalImage.Bounds())
// 将原始图片复制到新的图像上
draw.Draw(rgba, originalImage.Bounds(), originalImage, image.Point{}, draw.Src)
// 叠加水印图片到原始图片上
offset := image.Pt((originalImage.Bounds().Dx()-watermarkImage.Bounds().Dx())/2, (originalImage.Bounds().Dy()-watermarkImage.Bounds().Dy())/2)
draw.Draw(rgba, watermarkImage.Bounds().Add(offset), watermarkImage, image.Point{}, draw.Over)
// 创建输出文件
outputFile, err := os.Create(outputFilePath)
if err != nil {
return err
}
defer outputFile.Close()
// 将叠加水印后的图像写入输出文件
if err := jpeg.Encode(outputFile, rgba, &jpeg.Options{Quality: 100}); err != nil {
return err
}
return nil
}
在这个函数中,我们先创建了一个与原始图片大小相同的RGBA图像,并将原始图片复制到新图像上。然后,根据水印图片的大小调整水印的位置,并将水印图片叠加到原始图片上。最后,将包含水印的图像保存到输出文件中。
让我们来看一个完整的示例代码,演示如何使用上述函数给图片添加水印:
func main() {
// 加载原始图片
originalFilePath := "original.jpg"
originalFile, err := os.Open(originalFilePath)
if err != nil {
log.Fatal(err)
}
defer originalFile.Close()
originalImage, _, err := image.Decode(originalFile)
// 生成水印图片
watermarkText := "www.example.com"
watermarkImage := generateWatermark(originalImage.Bounds().Dx(), originalImage.Bounds().Dy(), watermarkText)
// 添加水印
outputFilePath := "output.jpg"
err = addWatermarkToImage(originalImage, watermarkImage, outputFilePath)
if err != nil {
log.Fatal(err)
}
// 输出结果
fmt.Println("Done! Watermarked image saved to", outputFilePath)
}
在这个示例中,我们首先加载了原始图片,并根据其大小生成水印图像。然后,调用addWatermarkToImage函数将水印添加到原始图片上,并保存到输出文件中。最后,打印出完成的消息和输出文件的路径。
总结起来,通过以上的步骤,我们可以使用golang轻松实现给图片添加水印的功能。利用"image"和"image/draw"包,我们可以加载、处理和保存图片,而使用自定义的RGBA图像,我们可以创建水印并将其叠加到原始图片上。无论是为了保护版权还是防止盗用,图片加水印都是一种有效的措施。