为了账号安全,请及时绑定邮箱和手机立即绑定

去图像处理

去图像处理

Go
HUH函数 2022-01-17 10:52:20
我需要加载图像并搜索颜色并替换它们。例如,在图像上,我需要搜索所有红色像素并将它们转换为紫色。我正在执行以下操作(img是有效.png图像):func colorize(img image.Image) {    b := image.NewRGBA(img.Bounds())    draw.Draw(b, b.Bounds(), img, image.ZP, draw.Src)    for x := 0; x < b.Bounds().Dx(); x++ {        for y := 0; y < b.Bounds().Dy(); y++ {            log.Println(b.At(x, y).RGBA())        }    }}事情img.At().RGBA()似乎没有返回正确的 R、G、B、A 代码?例如,我得到的数字大于 255。那么我应该如何读取所有图像像素,同时能够知道它们的 x 和 y 位置呢?
查看完整描述

1 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

img.At().RGBA()是Color.RGBA()。引用其文档:


// RGBA returns the alpha-premultiplied red, green, blue and alpha values

// for the color. Each value ranges within [0, 0xffff], but is represented

// by a uint32 so that multiplying by a blend factor up to 0xffff will not

// overflow.

//

// An alpha-premultiplied color component c has been scaled by alpha (a),

// so has valid values 0 <= c <= a.

由返回的分量RGBA()在 range 0..0xffff, not 0..0xff,并且它们也是 alpha 预乘的。


手动解码

取回该0..255范围内的红色、绿色、蓝色分量的一种方法是右移 8,例如:


r, g, b, a := b.At(x, y).RGBA()

r, g, b, a = r>>8, g>>8, b>>8, a>>8

log.Println(r, g, b) // Now in range 0..255

转换为 color.RGBA

另一种方法是将颜色转换color.RGBA为结构,其中包含简单明了的组件:


type RGBA struct {

        R, G, B, A uint8

}

由于您使用image.NewRGBA()which 返回类型的图像image.RGBA,因此该方法返回的颜色Image.At()将是动态类型color.RGBA,因此您可以简单地使用类型断言:


rgbacol := b.At(x, y).(color.RGBA)

log.Println(rgbacol.R, rgbacol.G, rgbacol.B, rgbacol.A)

一般来说(如果 image 不是 type image.RGBA),Image.At()可能是也可能不是具体 type color.RGBA。


因此,在一般情况下,您需要将颜色转换为 type 的值color.RGBA。颜色模型之间的转换由 建模color.Model,并且image/color包具有预定义的转换器。你需要的是color.RGBAModel. color.RGBAModel.Convert()将返回一个color.Color动态类型肯定是的值color.RGBA。


使用示例color.RGBAModel:


var c color.Color

c = color.Gray{160}


rgbacol := color.RGBAModel.Convert(c).(color.RGBA)


fmt.Println(rgbacol.R, rgbacol.G, rgbacol.B, rgbacol.A)

输出(在Go Playground上试试):


160 160 160 255

所以在你的循环中做:


rgbacol := color.RGBAModel.Convert(b.At(x, y).(color.RGBA)

// rgbacol is a struct of type color.RGBA, components are in range 0..255

笔记:


上述解决方案仍会为您返回 alpha 预乘分量。如果要撤消 alpha 预乘,可以使用color.NRGBAModel转换器(而不是color.RGBAModel)。


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号