gpt4 book ai didi

go - Alpha channel (PNG) 和 Golang 的问题

转载 作者:行者123 更新时间:2023-12-03 02:22:23 25 4
gpt4 key购买 nike

我在 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 图像没有奇怪的颜色。

最佳答案

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,因为该转换会保留最低 8 位,这可能是“随机”与 16 位值相比,您需要较高的 8 位:

realColor := color.RGBA{
R: uint8(R>>8),
G: uint8(G>>8),
B: uint8(B>>8),
A: uint8(A>>8),
}

关于go - Alpha channel (PNG) 和 Golang 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59046618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com