Golang实现为图片添加水印和文字的示例代码

 更新时间:2026年02月07日 09:57:43   作者:lxw1844912514  
在现代数字化和社交媒体的时代,图片处理已经成为了一项重要的技能,在本文中,我们将探讨使用Golang进行图片添加水印和文字,感兴趣的小伙伴可以了解下

在现代数字化和社交媒体的时代,图片处理已经成为了一项重要的技能。无论是个人使用还是商务运营,添加水印和文字都是常见的需求。在本文中,我们将探讨使用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图片添加水印和文字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang实现并发数控制的方法

    golang实现并发数控制的方法

    下面小编就为大家分享一篇golang实现并发数控制的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Go1.16新特性embed打包静态资源文件实现

    Go1.16新特性embed打包静态资源文件实现

    这篇文章主要为大家介绍了Go 1.16新特性embed打包静态资源文件的实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Golang中Gin框架中如何定义路由详解

    Golang中Gin框架中如何定义路由详解

    Gin是一个用Go语言编写的Web框架,具有高性能和易于使用的特点,本文将结合实际案例,详细介绍Gin框架的路由用法,有需要的小伙伴可以参考下
    2024-10-10
  • Golang中context库的高级应用

    Golang中context库的高级应用

    context库不仅对于提升代码的效率和性能至关重要,而且还帮助开发者在复杂的系统中保持代码的清晰和可维护性,下面我们就来看看context库的高级应用吧
    2024-01-01
  • 如何在 Go语言中使用日志包

    如何在 Go语言中使用日志包

    这篇文章主要介绍了如何在 Go语言中使用日志包,日志文件就是一种快速找到这些 bug,更好地了解程序工作状态的方法,下文基于go语言介绍该详细需要的小伙伴可以参考一下
    2022-04-04
  • 深入了解Golang的指针用法

    深入了解Golang的指针用法

    与C语言一样,Go语言中同样有指针,通过指针,我们可以只传递变量的内存地址,而不是传递整个变量,这在一定程度上可以节省内存的占用。本文将通过示例详细讲讲Golang的指针用法,需要的可以参考一下
    2022-07-07
  • Go语言利用泛型封装常见的Map操作

    Go语言利用泛型封装常见的Map操作

    Go 语言在 1.18 版本中引入了泛型,这是 Go 语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感兴趣的可以了解下
    2025-02-02
  • Golang实现结构体和Json格式数据之间的互相转换

    Golang实现结构体和Json格式数据之间的互相转换

    这篇文章主要为大家详细介绍了Golang实现结构体和Json格式数据之间的互相转换,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-12-12
  • Golang接口使用教程详解

    Golang接口使用教程详解

    在 Go 语言中接口包含两种含义:它既是方法的集合, 同时还是一种类型并且在Go 语言中是隐式实现的。本文通过示例详细介绍了Golang接口的使用,需要的可以参考一下
    2022-09-09
  • Go语言类型转换的方式有哪些

    Go语言类型转换的方式有哪些

    本文主要介绍了Go语言类型转换的方式有哪些,类型转换主要有4种,分别为断言类型转换、显式类型转换、隐式类型转换、强制类型转换,感兴趣的可以了解一下
    2023-11-11

最新评论