Go语言中如何初始化color.Color类型值用于像素颜色对比?
解决方法
不要直接用==对比两个color.Color接口变量,即使两者的颜色值完全一致,只要底层实现类型不同(比如一个是color.RGBA,另一个是color.NRGBA),对比结果也会为false。你可以选择以下两种方案实现对比:
通用兼容方案(适配所有图片格式)
通过Color接口统一的RGBA()方法获取预乘Alpha后的32位色值进行对比,该方法不需要关心图片的具体编码类型:
import "image/color" // 初始化目标颜色,color.RGBA结构体字段为uint8类型,直接传入你的RGBA值即可 targetColor := color.RGBA{R: 221, G: 223, B: 226, A: 255} tr, tg, tb, ta := targetColor.RGBA() // 原有遍历逻辑 for y := 0; y < height; y++ { for x := 0; x < width; x++ { r, g, b, a := img.At(x, y).RGBA() if r == tr && g == tg && b == tb && a == ta { // 颜色匹配,执行对应操作 } } }
高性能方案(确定图片为RGBA格式时使用)
如果你的截图固定为RGBA格式,可以直接将解码后的图片断言为*image.RGBA类型,直接读取像素数组避免At()方法的接口调用开销,适合大尺寸图片或者高频检测场景:
rgbaImg, ok := img.(*image.RGBA) if !ok { // 类型不匹配时可以回退到通用方案,或者手动转换为RGBA格式 } for y := 0; y < height; y++ { for x := 0; x < width; x++ { offset := y * rgbaImg.Stride + x*4 if rgbaImg.Pix[offset] == 221 && rgbaImg.Pix[offset+1] == 223 && rgbaImg.Pix[offset+2] == 226 && rgbaImg.Pix[offset+3] == 255 { // 颜色匹配,执行对应操作 } } }
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

