Image Go图像处理
我需要加载图像,搜索颜色并替换它们。例如,在图像上,我需要搜索所有红色像素并将其转换为紫色 我正在执行以下操作(Image Go图像处理,image,go,colors,rgba,Image,Go,Colors,Rgba,我需要加载图像,搜索颜色并替换它们。例如,在图像上,我需要搜索所有红色像素并将其转换为紫色 我正在执行以下操作(img是有效的.png图像): func着色(img image.image){ b:=image.NewRGBA(img.Bounds()) draw.draw(b,b.Bounds(),img,image.ZP,draw.Src) 对于x:=0;x
img
是有效的.png
图像):
func着色(img image.image){
b:=image.NewRGBA(img.Bounds())
draw.draw(b,b.Bounds(),img,image.ZP,draw.Src)
对于x:=0;x
事情是,img.At().RGBA()
似乎没有返回正确的R,G,B,A代码?例如,我得到的数字大于255
那么,我应该如何读取所有图像像素,同时能够知道它们的x和y位置呢。引用其文件:
// 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.
转换为color.RGBA
另一种方法是将颜色转换为结构,其中包含普通和简单的组件:
type RGBA struct {
R, G, B, A uint8
}
由于您使用的是返回类型为的图像的,因此image.At()
方法返回的颜色将是动态类型color.RGBA
,因此您可以简单地使用:
通常(如果图像不是image.RGBA
)类型,image.At()
可能是也可能不是具体类型的color.RGBA
因此,在一般情况下,您需要将颜色转换为color.RGBA
类型的值。颜色模型之间的转换由建模,并且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)
输出(在上尝试):
因此,在您的循环中:
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
)
rgbacol := b.At(x, y).(color.RGBA)
log.Println(rgbacol.R, rgbacol.G, rgbacol.B, rgbacol.A)
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)
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