引言
基础知识
图片转码是什么?
Golang中处理图片的常用库
image/png
:处理PNG图片image/jpeg
:处理JPEG图片github.com/nfnt/resize
:图片缩放和裁剪
基本操作
读取PNG文件
package main
import (
"image"
"image/color"
"image/png"
"os"
)
func main() {
file, err := os.Open("input.png")
if err != nil {
panic(err)
}
defer file.Close()
img, _, err := image.Decode(file)
if err != nil {
panic(err)
}
// 处理图片
// ...
// 保存图片
err = png.Encode(os.Stdout, img)
if err != nil {
panic(err)
}
}
保存PNG文件
图片裁剪和缩放
package main
import (
"image"
"image/color"
"image/png"
"os"
"github.com/nfnt/resize"
)
func main() {
file, err := os.Open("input.png")
if err != nil {
panic(err)
}
defer file.Close()
img, _, err := image.Decode(file)
if err != nil {
panic(err)
}
// 裁剪图片
// 裁剪区域为(x, y, width, height)
cropRect := image.Rect(100, 100, 400, 400)
cropped := img.Crop(cropRect)
// 缩放图片
newSize := image.Rect(100, 100, 200, 200)
resized := resize.Resize(newSize, cropped)
// 保存裁剪和缩放后的图片
err = png.Encode(os.Stdout, resized)
if err != nil {
panic(err)
}
}
高级功能
使用 image/color
处理颜色
package main
import (
"image"
"image/color"
"image/png"
"os"
)
func main() {
file, err := os.Open("input.png")
if err != nil {
panic(err)
}
defer file.Close()
img, _, err := image.Decode(file)
if err != nil {
panic(err)
}
// 获取图片的像素
for y := 0; y < img.Bounds().Dy(); y++ {
for x := 0; x < img.Bounds().Dx(); x++ {
r, g, b, a := img.At(x, y).RGBA()
newR, newG, newB := r+50, g+50, b+50 // 增加亮度
img.Set(x, y, color.RGBA{R: uint8(newR), G: uint8(newG), B: uint8(newB), A: uint8(a)})
}
}
// 保存处理后的图片
err = png.Encode(os.Stdout, img)
if err != nil {
panic(err)
}
}
优化PNG性能
”`go package main
import (
"image"
"image/png"
"os"
)
func main() {
file, err := os.Open("input.png")
if err != nil {
panic(err)
}
defer file.Close()
img, _, err := image.Decode(file)
if err != nil {
panic(err)
}
// 保存