1 回答

TA貢獻1806條經驗 獲得超8個贊
這是因為該Set()方法設置(覆蓋)指定位置像素的顏色。這不是你想要的。
您希望將像素的原始顏色與您選擇的顏色相結合,并希望將其作為最終顏色。
為此,首先您可以使用 查詢原始顏色Image.At(),然后將顏色與您想要的任何顏色組合(您可以分別通過紅色、綠色、藍色和 alpha 通道進行此操作),并使用Set()方法設置最終顏色。
結合:
請注意,color.RGBA結構的R, G, B,A字段是 alpha 預乘值,這意味著該字段例如保存顏色的紅色分量乘以 alpha 通道的值。R
您可以使用RGBA.RGBA()將所有字段作為uint32值返回的方法,并且所有字段都在范圍內,0..0xffff因此您可以對它們進行操作而不必擔心溢出(最大值為uint8is 255,因此即使添加其中的 2 個也很容易溢出)。
因此,當您組合 2 種顏色時,您可以按組件組合。但是請注意,這些字段的類型color.RGBA是uint8,因此組合后您必須將結果轉換為適合 8 位,因此您必須右移 8。
一個非常簡單的組合:計算平均值:
// Query:
x, y := 1, 1
r, g, b, a := img.At(x, y).RGBA()
// Combine:
col := color.RGBA{85, 165, 34, 50}
r2, g2, b2, a2 := col.RGBA()
col.R = uint8((r + r2) >> 9) // div by 2 followed by ">> 8" is ">> 9"
col.G = uint8((g + g2) >> 9)
col.B = uint8((b + b2) >> 9)
col.A = uint8((a + a2) >> 9)
// Set new pixel:
img.Set(x, y, col)
您可以將其合并到輔助函數中:
func combine(c1, c2 color.Color) color.Color {
r, g, b, a := c1.RGBA()
r2, g2, b2, a2 := c2.RGBA()
return color.RGBA{
uint8((r + r2) >> 9), // div by 2 followed by ">> 8" is ">> 9"
uint8((g + g2) >> 9),
uint8((b + b2) >> 9),
uint8((a + a2) >> 9),
}
}
并使用它:
x, y := 1, 1
img.Set(x, y, combine(img.At(x, y), color.RGBA{85, 165, 34, 50}))
如果您需要逼真的色彩合成,請查看Alpha 合成頁面。
- 1 回答
- 0 關注
- 154 瀏覽
添加回答
舉報