亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

透明像素顏色 - Go lang image

透明像素顏色 - Go lang image

Go
神不在的星期二 2022-01-04 13:29:53
我正在嘗試根據眼動儀結果創建熱圖(顯示用戶最常查看屏幕上的位置)。對于用戶經常查看的像素,我想設置不透明的紅色、不太常見的橙色等。我使用紅色到綠色的色標。但是對于頻率最低的像素,我希望它們不僅顯示綠色,還希望它們透明。imgfile, err := os.Open("unchanged.jpeg")defer imgfile.Close()if err != nil {    fmt.Println(err.Error())}decodedImg, err := jpeg.Decode(imgfile)img := image.NewRGBA(decodedImg.Bounds())size := img.Bounds().Size()for x := 0; x < size.X; x++ {    for y := 0; y < size.Y; y++ {        img.Set(x, y, decodedImg.At(x, y))    }}// I change some pixels here with img.Set(...)outFile, _ := os.Create("changed.png")defer outFile.Close()png.Encode(outFile, img)問題是,例如,當我嘗試更改顏色時,img.Set(x, y, color.RGBA{85, 165, 34, 50})它實際上并沒有根據舊顏色和新顏色將像素著色為平均值,它只是顯示一些新的、看起來很奇怪的顏色。alpha RGBA 值設置為 50 的圖像:(透明)alpha RGBA 值設置為 255 的圖像:(不透明)據我所知,我正在使用支持透明度的 png 圖像。為什么會發生這種情況?有什么想法可以解決這個問題并使最不常見的像素看起來透明?感謝您的每一個回答。
查看完整描述

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 合成頁面。


查看完整回答
反對 回復 2022-01-04
  • 1 回答
  • 0 關注
  • 154 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號