在go语言中获取获取每个图像像素的RGBA值代码示例
如果有这么个需求要你找出图像上每个像素的R、G、B、A值。
也许是为了做ASCII艺术、用于认知目的的边缘检测算法或一些高级图像处理。
你该怎么着手实现呢?
解决方式:
使用函数获取图像文件的宽度和高度,image.DecodeConfig()然后根据覆盖整个图像的图像的宽度/高度迭代每个像素。
在每个像素处,使用image.At()函数的 RGBA() 方法来检索 R、G、B、A 值。
示例代码:
package main
import (
"fmt"
"image"
"image/jpeg"
"os"
)
func init() {
// 非常重要,否则At()、Bounds()函数将
// 导致内存指针错误!!
image.RegisterFormat("jpeg", "jpeg", jpeg.Decode, jpeg.DecodeConfig)
}
func main() {
imgfile, err := os.Open("./img.jpg")
if err != nil {
fmt.Println("img.jpg文件未找到!")
os.Exit(1)
}
defer imgfile.Close()
//用image/jpeg获取图像的高度和宽度。
//根据文件是png还是gif来改变。
imgCfg, _, err := image.DecodeConfig(imgfile)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
width := imgCfg.Width
height := imgCfg.Height
fmt.Println("宽度 : ", width)
fmt.Println("高度 : ", height)
// 我们需要再次重置io.Reader,以便下面的image.Decode()函数能够工作。
// 否则我们会 - 惊慌失措:运行时错误:无效的内存地址或零指针解除引用
// io.Reader没有内置的倒退功能,使用Seek(0,0)。
imgfile.Seek(0, 0)
//获取图像
img, _, err := image.Decode(imgfile)
fmt.Println(img.At(10, 10).RGBA())
for y := 0; y < height; y++ {
for x := 0; x < width; x++ {
r, g, b, a := img.At(x, y).RGBA()
fmt.Printf("[X : %d Y : %v] R : %v, G : %v, B : %v, A : %v \n", x, y, r, g, b, a)
}
}
}
相关文章