【问题标题】:Problems with Alpha channel(PNG) and GolangAlpha 通道(PNG)和 Golang 的问题
【发布时间】:2020-03-21 14:49:20
【问题描述】:

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

【问题讨论】:

    标签: go png


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    似乎这个问题也与color.RGBA 有关-如果我将它与255 以外的alpha 一起使用,我会在生成的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),
    }
    

    【讨论】:

      猜你喜欢
      • 2018-04-25
      • 2011-10-29
      • 2011-06-06
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 2016-07-26
      相关资源
      最近更新 更多