Golang实现为图片添加水印和文字的示例代码
作者:lxw1844912514
在现代数字化和社交媒体的时代,图片处理已经成为了一项重要的技能。无论是个人使用还是商务运营,添加水印和文字都是常见的需求。在本文中,我们将探讨使用Golang进行图片处理的方法,学习如何添加水印和文字。
背景
Golang是一门开源的编程语言,以其简洁的语法、高效的性能和强大的并发能力而闻名。它已经成为许多开发者的首选语言之一。在Golang中,有一些强大的第三方库,使得图片处理变得容易而且高效。
添加水印
添加水印是一种保护个人或商业图片版权的常见技术。下面是一个示例,展示了如何使用Golang添加水印到一张图片上:
package main
import (
"image"
"image/draw"
"image/jpeg"
"os"
)
func main() {
// 打开原始图片
file, err := os.Open("original.jpg")
if err != nil {
panic(err)
}
defer file.Close()
// 解码图片
img, _, err := image.Decode(file)
if err != nil {
panic(err)
}
// 创建一个画布
bounds := img.Bounds()
canvas := image.NewRGBA(bounds)
// 绘制原始图片到画布上
draw.Draw(canvas, bounds, img, image.Point{}, draw.Src)
// 添加水印
watermark := image.NewRGBA(image.Rect(0, 0, 100, 50))
draw.Draw(canvas, image.Rect(bounds.Dx()-100, bounds.Dy()-50, bounds.Dx(), bounds.Dy()), watermark, image.Point{}, draw.Src)
// 保存处理后的图片
output, err := os.Create("output.jpg")
if err != nil {
panic(err)
}
defer output.Close()
// 编码保存到文件
jpeg.Encode(output, canvas, nil)
}以上代码首先打开了一张名为"original.jpg"的图片文件。然后将其解码为一个image.Image对象,接着创建了一个新的RGBA画布,并将原始图片绘制到画布上。最后,创建了一个100x50大小的水印,并将其绘制到画布的右下角。最终生成的带有水印的图片被保存为"output.jpg"。
添加文字
添加文字是另一种常见的图片处理需求,它可以用来添加标题、描述或其他说明。下面是一个示例,展示了如何使用Golang在图片上添加文字:
package main
import (
"image"
"image/draw"
"image/jpeg"
"os"
"github.com/golang/freetype"
"github.com/golang/freetype/truetype"
"golang.org/x/image/font"
)
func main() {
// 打开原始图片
file, err := os.Open("original.jpg")
if err != nil {
panic(err)
}
defer file.Close()
// 解码图片
img, _, err := image.Decode(file)
if err != nil {
panic(err)
}
// 创建一个画布
bounds := img.Bounds()
canvas := image.NewRGBA(bounds)
// 绘制原始图片到画布上
draw.Draw(canvas, bounds, img, image.Point{}, draw.Src)
// 添加文字
fontBytes, err := os.ReadFile("font.ttf")
if err != nil {
panic(err)
}
font, err := freetype.ParseFont(fontBytes)
if err != nil {
panic(err)
}
context := freetype.NewContext()
context.SetDPI(72)
context.SetFont(font)
context.SetFontSize(24)
context.SetClip(bounds)
context.SetDst(canvas)
context.SetSrc(image.Black)
pt := freetype.Pt(10, 10+int(context.PointToFixed(24)>>6))
context.DrawString("Hello, Golang!", pt)
// 保存处理后的图片
output, err := os.Create("output.jpg")
if err != nil {
panic(err)
}
defer output.Close()
// 编码保存到文件
jpeg.Encode(output, canvas, nil)
}以上代码与添加水印的示例类似,但我们使用了第三方库freetype来添加文字。
首先打开了一张名为"original.jpg"的图片文件,然后解码为image.Image对象。接着创建了一个新的RGBA画布,并将原始图片绘制到画布上。
然后,加载了一个TrueType字体文件并将其解析为freetype.Font对象。创建了一个freetype.Context对象,并设置了字体、字号等绘制参数。
最后,调用了DrawString函数,在画布上添加了文字。最终生成的图片被保存为"output.jpg"。
方法补充
下面小编为大家整理了Golang图片添加水印的其他方法,希望对大家有所帮助
1.用golang 实现给图片添加文字水印
package main
import (
"fmt"
"github.com/golang/freetype"
"image"
"image/draw"
"image/jpeg"
"io"
"os"
"time"
)
func main() {
// 打开原始图片
file, err := os.Open("004.jpeg")
if err != nil {
panic(err)
}
defer file.Close()
// 解码图片
img, _, err := image.Decode(file)
if err != nil {
panic(err)
}
// 创建一个画布
bounds := img.Bounds()
canvas := image.NewRGBA(bounds)
// 打开图像文件
fileInfo, err := os.Stat("004.jpeg")
if err != nil {
fmt.Sprintf("无法获取文件信息:%v", err)
}
fmt.Println("文件名:",fileInfo.Name())
//添加该行问题解决
file.Seek(0, io.SeekStart)
// 读取图像信息
config, _, err := image.DecodeConfig(file)
if err != nil {
fmt.Println("无法读取图像配置", err)
}
width := config.Width
height := config.Height
fmt.Println("图片宽度为:", width)
fmt.Println("图片高度为:", height)
//s,err:=file.Stat()
//fmt.Println(file.Name(),s.Size(),s.Sys(),s.Mode(),s.ModTime())
// 绘制原始图片到画布上
draw.Draw(canvas, bounds, img, image.Point{}, draw.Src)
// 添加文字
fontBytes, err := os.ReadFile("../ttf/kaiti.TTF") //解析中文
//fontBytes, err := os.ReadFile("../ttf/luxisr.ttf") //不解析中文
if err != nil {
panic(err)
}
font, err := freetype.ParseFont(fontBytes)
if err != nil {
panic(err)
}
context := freetype.NewContext()
context.SetDPI(72)
context.SetFont(font)
context.SetFontSize(25)
context.SetClip(bounds)
context.SetDst(canvas)
context.SetSrc(image.Opaque)
//pt := freetype.Pt(0, 5+int(context.PointToFixed(24)>>6))
pt := freetype.Pt(250, height-34+int(context.PointToFixed(24)>>6)) //距离左侧5,距离顶部height-34=960-34=926
context.DrawString("来源公众号:【码农编程进阶笔记】", pt)
// 保存处理后的图片
filename := fmt.Sprintf("output_%d.jpg", time.Now().Unix())
output, err := os.Create(filename)
if err != nil {
panic(err)
}
defer output.Close()
// 编码保存到文件
jpeg.Encode(output, canvas, nil)
}2.golang图片式水印处理
//golang图片式水印处理
//未实现Web上传等代码...
//sam
//2013.6.19
//http://zituo.net
package main
import (
"fmt"
"image"
"image/draw"
"image/jpeg"
"image/png"
"os"
)
func main() {
//原始图片是sam.jpg
imgb, _ := os.Open("sam.jpg")
img, _ := jpeg.Decode(imgb)
defer imgb.Close()
wmb, _ := os.Open("text.png")
watermark, _ := png.Decode(wmb)
defer wmb.Close()
//把水印写到右下角,并向0坐标各偏移10个像素
offset := image.Pt(img.Bounds().Dx()-watermark.Bounds().Dx()-10, img.Bounds().Dy()-watermark.Bounds().Dy()-10)
b := img.Bounds()
m := image.NewNRGBA(b)
draw.Draw(m, b, img, image.ZP, draw.Src)
draw.Draw(m, watermark.Bounds().Add(offset), watermark, image.ZP, draw.Over)
//生成新图片new.jpg,并设置图片质量..
imgw, _ := os.Create("new.jpg")
jpeg.Encode(imgw, m, &jpeg.Options{100})
defer imgw.Close()
fmt.Println("水印添加结束,请查看new.jpg图片...")
}结语
Golang作为一门强大的编程语言,拥有丰富的第三方库和工具,使得图片处理变得简单而高效。
到此这篇关于Golang实现为图片添加水印和文字的示例代码的文章就介绍到这了,更多相关Golang图片添加水印和文字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
