猿问

去图像处理

我需要加载图像并搜索颜色并替换它们。例如,在图像上,我需要搜索所有红色像素并将它们转换为紫色。


我正在执行以下操作(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 位置呢?


HUH函数
浏览 157回答 1
1回答

蝴蝶不菲

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>>8log.Println(r, g, b) // Now in range 0..255转换为 color.RGBA另一种方法是将颜色转换color.RGBA为结构,其中包含简单明了的组件:type RGBA struct {&nbsp; &nbsp; &nbsp; &nbsp; 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.Colorc = 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)。
随时随地看视频慕课网APP

相关分类

Go
我要回答