在go语言中获取获取每个图像像素的RGBA值代码示例

2023-06-01 00:00:00 示例 获取 像素

如果有这么个需求要你找出图像上每个像素的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)
                 }
         }
 }

相关文章