返回
Go 语言图片处理那些事
后端
2024-01-19 04:06:17
## 前言
在计算机图形领域中,图片处理是一个重要的课题。图片处理可以用于各种目的,包括图像编辑、图像分析、图像识别、图像压缩等。在 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 函数可以在图片上绘制指定