返回

Go 语言图片处理那些事

后端







## 前言

在计算机图形领域中,图片处理是一个重要的课题。图片处理可以用于各种目的,包括图像编辑、图像分析、图像识别、图像压缩等。在 Go 语言中,Image 库提供了丰富的功能,可以帮助您轻松完成各种图片处理任务。

## 图片加载

Image 库提供了多种方法来加载图片。最常见的方法是使用 Open 函数。Open 函数可以加载各种格式的图片,包括 JPEG、PNG、GIF、BMP 等。例如,以下代码演示了如何使用 Open 函数加载一张 JPEG 图片:

```go
package main

import (
	"fmt"
	"image"
	"image/jpeg"
	"os"
)

func main() {
	// 打开一张 JPEG 图片
	f, err := os.Open("image.jpg")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()

	// 将图片解码成 image.Image 类型
	img, err := jpeg.Decode(f)
	if err != nil {
		fmt.Println(err)
		return
	}

	// 打印图片的尺寸
	fmt.Println("图片尺寸:", img.Bounds().Size())
}

图片保存

Image 库还提供了多种方法来保存图片。最常见的方法是使用 Encode 函数。Encode 函数可以将 image.Image 类型的数据编码成各种格式的图片,包括 JPEG、PNG、GIF、BMP 等。例如,以下代码演示了如何使用 Encode 函数将一张 image.Image 类型的图片保存为 JPEG 格式:

package main

import (
	"fmt"
	"image"
	"image/jpeg"
	"os"
)

func main() {
	// 创建一张 image.Image 类型的图片
	img := image.NewRGBA(image.Rect(0, 0, 100, 100))

	// 将图片保存为 JPEG 格式
	f, err := os.Create("image.jpg")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()

	err = jpeg.Encode(f, img, nil)
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println("图片保存成功")
}

裁剪

Image 库提供了多种方法来裁剪图片。最常见的方法是使用 Crop 函数。Crop 函数可以从一张图片中裁剪出一个矩形区域。例如,以下代码演示了如何使用 Crop 函数从一张图片中裁剪出一个 100x100 的矩形区域:

package main

import (
	"fmt"
	"image"
	"image/jpeg"
	"os"
)

func main() {
	// 打开一张 JPEG 图片
	f, err := os.Open("image.jpg")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()

	// 将图片解码成 image.Image 类型
	img, err := jpeg.Decode(f)
	if err != nil {
		fmt.Println(err)
		return
	}

	// 从图片中裁剪出一个 100x100 的矩形区域
	croppedImg := img.SubImage(image.Rect(0, 0, 100, 100))

	// 将裁剪后的图片保存为 JPEG 格式
	f, err = os.Create("cropped_image.jpg")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()

	err = jpeg.Encode(f, croppedImg, nil)
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println("裁剪后的图片保存成功")
}

缩放

Image 库提供了多种方法来缩放图片。最常见的方法是使用 Resize 函数。Resize 函数可以将一张图片缩放成指定的大小。例如,以下代码演示了如何使用 Resize 函数将一张图片缩放成 100x100 的大小:

package main

import (
	"fmt"
	"image"
	"image/jpeg"
	"os"
)

func main() {
	// 打开一张 JPEG 图片
	f, err := os.Open("image.jpg")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()

	// 将图片解码成 image.Image 类型
	img, err := jpeg.Decode(f)
	if err != nil {
		fmt.Println(err)
		return
	}

	// 将图片缩放成 100x100 的大小
	resizedImg := image.NewRGBA(image.Rect(0, 0, 100, 100))
	err = resizedImg.Draw(resizedImg.Rect, img, image.Point{}, image.Src)
	if err != nil {
		fmt.Println(err)
		return
	}

	// 将缩放后的图片保存为 JPEG 格式
	f, err = os.Create("resized_image.jpg")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()

	err = jpeg.Encode(f, resizedImg, nil)
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println("缩放后的图片保存成功")
}

自由绘制

Image 库提供了多种方法来在图片上自由绘制。最常见的方法是使用 Draw 函数。Draw 函数可以将各种形状和线条绘制到图片上。例如,以下代码演示了如何使用 Draw 函数在图片上绘制一个圆形:

package main

import (
	"fmt"
	"image"
	"image/color"
	"image/draw"
	"os"
)

func main() {
	// 创建一张 100x100 的白色图片
	img := image.NewRGBA(image.Rect(0, 0, 100, 100))

	// 在图片上绘制一个圆形
	draw.Draw(img, image.Rect(50, 50, 100, 100), &image.Circle{P: image.Point{X: 75, Y: 75}, R: 50}, image.Point{}, draw.Src)

	// 将图片保存为 PNG 格式
	f, err := os.Create("drawn_image.png")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()

	err = png.Encode(f, img)
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println("绘制后的图片保存成功")
}

添加文字

Image 库提供了多种方法来在图片上添加文字。最常见的方法是使用 DrawString 函数。DrawString 函数可以在图片上绘制指定