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

Alpha 通道(PNG) 和 Golang 的问题

Alpha 通道(PNG) 和 Golang 的问题

Go
喵喔喔 2023-08-07 14:56:54
我在 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.Closeutils.ShowFatalError(err) // Show panic log if err != nil决赛:[ 1 ]如果我使用 jpeg.Decode 而不是 png.Decode 图像没有奇怪的颜色。
查看完整描述

2 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

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),
}


查看完整回答
反对 回复 2023-08-07
?
狐的传说

TA贡献1804条经验 获得超3个赞

似乎这个问题也与color.RGBA- 如果我将其与 alpha 一起使用,而不是255在生成的 PNG 中得到奇怪的颜色。在我切换到color.NRGBA(按照接受的答案中的建议)之后,我得到了正确的颜色渲染。

所以不要使用

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),
}


查看完整回答
反对 回复 2023-08-07
  • 2 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信