[英]Problems with Alpha channel(PNG) and Golang
我在 golang 中的图像有一个简单的问题。 我正在用颜色绘制 png 图像,但结果不是我想要的。
在 Alpha 值最小的像素中,涂上另一种颜色。 我正在使用 alphaChannel = false
/* return new image with new color
* alphaChannel = true get AlphaChannel from given color
* alphaChannel = false get AlphaChannel from image (x,y) point
*/
func PaintPngImage(img image.Image, cl color.Color, alphaChannel bool) image.Image {
R, G, B, A := cl.RGBA()
composeImage := image.NewRGBA(img.Bounds())
// paint image over a new image
draw.Draw(composeImage, composeImage.Bounds(), img, image.Point{}, draw.Over)
// paint new color over the image
bounds := composeImage.Bounds()
w, h := bounds.Max.X, bounds.Max.Y
for x := 0; x < w; x++ {
for y := 0; y < h; y++ {
_, _, _, aa := composeImage.At(x, y).RGBA()
if !alphaChannel {
A = aa
}
realColor := color.RGBA{R: uint8(R),G: uint8(G),B: uint8(B),A: uint8(A)}
if aa != 0 {
composeImage.Set(x, y, realColor)
}
}
}
return composeImage
}
colorLayer := PaintPngImage(layerImage, cl, false)
out, err := os.Create("./output/test.png")
utils.ShowFatalError(err)
err = png.Encode(out, colorLayer)
utils.CloseFile(out) // close file os.Close
utils.ShowFatalError(err) // Show panic log if err != nil
决赛:[ 1 ]
如果我用jpeg.Decode而不是png.Decode图像已经不奇怪colors了。
Color.RGBA()
返回0..0xffff
范围内的颜色分量,而不是0..0xff
:
// 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.
因此,在构建要绘制的颜色时,您必须将所有 16 位组件右移(8 位),而不仅仅是转换为uint8
因为该转换保留了与 16 位值相比可能是“随机”的最低 8 位,并且您需要较高的 8 位:
realColor := color.RGBA{
R: uint8(R>>8),
G: uint8(G>>8),
B: uint8(B>>8),
A: uint8(A>>8),
}
似乎问题也与color.RGBA
有关 - 如果我将它与 alpha 一起使用而不是255
我在生成的 PNG 中变得奇怪 colors 。 在我切换到color.NRGBA
之后(按照接受的答案中的建议),我得到了正确的 colors 渲染。
所以不要使用
newColor := color.RGBA{
R: uint8(R>>8),
G: uint8(G>>8),
B: uint8(B>>8),
A: uint8(A>>8),
}
反而
newColor := color.NRGBA{
R: uint8(R>>8),
G: uint8(G>>8),
B: uint8(B>>8),
A: uint8(A>>8),
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.