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

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

去圖像處理

去圖像處理

Go
HUH函數 2022-01-17 10:52:20
我需要加載圖像并搜索顏色并替換它們。例如,在圖像上,我需要搜索所有紅色像素并將它們轉換為紫色。我正在執行以下操作(img是有效.png圖像):func colorize(img image.Image) {    b := image.NewRGBA(img.Bounds())    draw.Draw(b, b.Bounds(), img, image.ZP, draw.Src)    for x := 0; x < b.Bounds().Dx(); x++ {        for y := 0; y < b.Bounds().Dy(); y++ {            log.Println(b.At(x, y).RGBA())        }    }}事情img.At().RGBA()似乎沒有返回正確的 R、G、B、A 代碼?例如,我得到的數字大于 255。那么我應該如何讀取所有圖像像素,同時能夠知道它們的 x 和 y 位置呢?
查看完整描述

1 回答

?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

img.At().RGBA()是Color.RGBA()。引用其文檔:


// 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.

//

// An alpha-premultiplied color component c has been scaled by alpha (a),

// so has valid values 0 <= c <= a.

由返回的分量RGBA()在 range 0..0xffff, not 0..0xff,并且它們也是 alpha 預乘的。


手動解碼

取回該0..255范圍內的紅色、綠色、藍色分量的一種方法是右移 8,例如:


r, g, b, a := b.At(x, y).RGBA()

r, g, b, a = r>>8, g>>8, b>>8, a>>8

log.Println(r, g, b) // Now in range 0..255

轉換為 color.RGBA

另一種方法是將顏色轉換color.RGBA為結構,其中包含簡單明了的組件:


type RGBA struct {

        R, G, B, A uint8

}

由于您使用image.NewRGBA()which 返回類型的圖像image.RGBA,因此該方法返回的顏色Image.At()將是動態類型color.RGBA,因此您可以簡單地使用類型斷言:


rgbacol := b.At(x, y).(color.RGBA)

log.Println(rgbacol.R, rgbacol.G, rgbacol.B, rgbacol.A)

一般來說(如果 image 不是 type image.RGBA),Image.At()可能是也可能不是具體 type color.RGBA。


因此,在一般情況下,您需要將顏色轉換為 type 的值color.RGBA。顏色模型之間的轉換由 建模color.Model,并且image/color包具有預定義的轉換器。你需要的是color.RGBAModel. color.RGBAModel.Convert()將返回一個color.Color動態類型肯定是的值color.RGBA。


使用示例color.RGBAModel:


var c color.Color

c = color.Gray{160}


rgbacol := color.RGBAModel.Convert(c).(color.RGBA)


fmt.Println(rgbacol.R, rgbacol.G, rgbacol.B, rgbacol.A)

輸出(在Go Playground上試試):


160 160 160 255

所以在你的循環中做:


rgbacol := color.RGBAModel.Convert(b.At(x, y).(color.RGBA)

// rgbacol is a struct of type color.RGBA, components are in range 0..255

筆記:


上述解決方案仍會為您返回 alpha 預乘分量。如果要撤消 alpha 預乘,可以使用color.NRGBAModel轉換器(而不是color.RGBAModel)。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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