golang image图片处理示例
发布时间:2023-05-16 02:20:02
Go语言可以用来处理图片,其中一个著名的库就是Go语言自带的image。该库可以让我们轻松的创建和操作图片。本文将介绍一些Go语言image处理的示例。
1. 创建一张简单的图片
我们可以使用image库来创建一张简单的图片。下面是一个简单示例,创建了一个红色的正方形图片。
package main
import (
"image"
"image/color"
"image/png"
"os"
)
func main() {
img := image.NewRGBA(image.Rect(0, 0, 200, 200))
// 填充红色
for y := 0; y < img.Bounds().Dy(); y++ {
for x := 0; x < img.Bounds().Dx(); x++ {
img.Set(x, y, color.RGBA{255, 0, 0, 255})
}
}
// 保存图片
f, _ := os.Create("red.png")
defer f.Close()
_ = png.Encode(f, img)
}
2. 缩放图片
使用Go语言的image库可以轻松缩放图片。下面是一个简单的示例,缩放一张图片的宽度为一半。
package main
import (
"image"
"image/jpeg"
"os"
)
func main() {
// 打开图片
f, _ := os.Open("img.jpg")
defer f.Close()
img, _ := jpeg.Decode(f)
// 缩放图片
w := img.Bounds().Dx() / 2
h := img.Bounds().Dy()
newImg := image.NewRGBA(image.Rect(0, 0, w, h))
for y := 0; y < h; y++ {
for x := 0; x < w; x++ {
newImg.Set(x, y, img.At(x*2, y))
}
}
// 保存图片
f, _ = os.Create("img_half.jpg")
defer f.Close()
_ = jpeg.Encode(f, newImg, nil)
}
3. 图片旋转
使用Go语言的image库可以轻松旋转图片。下面是一个简单的示例,将一张图片旋转90度。
package main
import (
"image"
"image/jpeg"
"math"
"os"
)
func main() {
// 打开图片
f, _ := os.Open("img.jpg")
defer f.Close()
img, _ := jpeg.Decode(f)
// 旋转图片
w := img.Bounds().Dy()
h := img.Bounds().Dx()
newImg := image.NewRGBA(image.Rect(0, 0, w, h))
centerX := float64(w) / 2
centerY := float64(h) / 2
for y := 0; y < h; y++ {
for x := 0; x < w; x++ {
newX := int(math.Cos(math.Pi/2)*float64(x-int(centerX)) - math.Sin(math.Pi/2)*float64(y-int(centerY)) + centerX)
newY := int(math.Sin(math.Pi/2)*float64(x-int(centerX)) + math.Cos(math.Pi/2)*float64(y-int(centerY)) + centerY)
newImg.Set(newX, newY, img.At(x, y))
}
}
// 保存图片
f, _ = os.Create("rotate_img.jpg")
defer f.Close()
_ = jpeg.Encode(f, newImg, nil)
}
4. 压缩图片
有时候我们需要将图片压缩到一个较小的尺寸,这时可以使用image库中的Resample函数来实现。
package main
import (
"image"
"image/jpeg"
"os"
)
func main() {
// 打开图片
f, _ := os.Open("img.jpg")
defer f.Close()
img, _ := jpeg.Decode(f)
// 压缩图片
w := img.Bounds().Dx() / 2
h := img.Bounds().Dy() / 2
newImg := image.NewRGBA(image.Rect(0, 0, w, h))
draw.ApproxBiLinear.Scale(newImg, newImg.Bounds(), img, img.Bounds(), draw.Over, nil)
// 保存图片
f, _ = os.Create("compress.jpg")
defer f.Close()
_ = jpeg.Encode(f, newImg, nil)
}
5. 图片合并
使用Go语言的image库可以轻松合并多张图片到一张图片中。下面是一个简单的示例,将两张图片合并。
package main
import (
"image"
"image/jpeg"
"os"
)
func main() {
// 打开图片1
f, _ := os.Open("img1.jpg")
defer f.Close()
img1, _ := jpeg.Decode(f)
// 打开图片2
f, _ = os.Open("img2.jpg")
defer f.Close()
img2, _ := jpeg.Decode(f)
// 合并图片
w := img1.Bounds().Dx() + img2.Bounds().Dx()
h := img1.Bounds().Dy()
newImg := image.NewRGBA(image.Rect(0, 0, w, h))
for y := 0; y < h; y++ {
for x := 0; x < w; x++ {
if x < img1.Bounds().Dx() {
newImg.Set(x, y, img1.At(x, y))
} else {
newImg.Set(x, y, img2.At(x-img1.Bounds().Dx(), y))
}
}
}
// 保存图片
f, _ = os.Create("merge.jpg")
defer f.Close()
_ = jpeg.Encode(f, newImg, nil)
}
总结
Go语言的image库提供了很多方便的函数,可以快速实现图片处理的需求。本文介绍了一些常见的图片处理示例,希望对大家有所帮助。
