golang 图片加水印

发布时间:2024-12-23 03:45:06

图片加水印是一个常见的需求,特别在一些需要保护版权或者防止盗用的场合,给图片添加水印可以有效地防止他人恶意使用图片。在golang中,我们可以通过一些库和技术实现图片加水印的功能。

使用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图像,我们可以创建水印并将其叠加到原始图片上。无论是为了保护版权还是防止盗用,图片加水印都是一种有效的措施。

相关推荐