我遇到這個問題已經有一段時間了:我正在創建一個模塊來處理圖像,我的功能之一是遍歷圖像的每個像素并反轉顏色。該函數在編碼 .png 圖像時返回預期結果,但它“飽和”了 .jpeg/jpg 圖像。處理 .png 圖像時的示例(正確):https ://i.imgur.com/DG35RsR.png處理 .jpeg 圖像時的示例(錯誤):https ://i.imgur.com/DZQmxJ2.png我正在研究并發現最接近我的問題,雖然這不是答案,但這個問題來自 Go 存儲庫:https ://github.com/golang/go/issues/23936// InvertColors functionfunc InvertColors(img image.Image) image.Image { bounds := img.Bounds() width := bounds.Max.X height := bounds.Max.Y inverted := image.NewRGBA(bounds) for y := bounds.Min.Y; y < height; y++ { for x := bounds.Min.X; x < width; x++ { r, g, b, a := img.At(x, y).RGBA() c := color.RGBA{uint8(255 - r), uint8(255 - g), uint8(255 - b), uint8(a)} inverted.SetRGBA(x, y, c) } } return inverted}// main examplefunc main() { link := "https://i.imgur.com/n5hsdl4.jpg" img, err := GetImageFromURL(link) if err != nil { panic(err) } buf := new(bytes.Buffer) Encode(buf, img, "jpg") ioutil.WriteFile("temp.jpg", buf.Bytes(), 0666) invImg := InvertColors(img) buf = new(bytes.Buffer) Encode(buf, invImg, "jpg") ioutil.WriteFile("temp2.jpg", buf.Bytes(), 0666)}// GetImageFromURL func GetImageFromURL(link string) (image.Image, error) { _, format, err := ParseURL(link) if err != nil { return nil, err } req, err := http.NewRequest("GET", link, nil) if err != nil { return nil, err } // Required to make a request. req.Close = true req.Header.Set("Content-Type", "image/"+format) res, err := http.DefaultClient.Do(req) if err != nil { return nil, err } defer res.Body.Close() b, err := ioutil.ReadAll(res.Body) if err != nil { return nil, err } img, err := Decode(bytes.NewReader(b), format) if err != nil { return nil, err } return img, nil}
1 回答

九州編程
TA貢獻1785條經驗 獲得超4個贊
您的代碼中有兩個與顏色處理相關的錯誤(第二個可能不相關)。
首先,該RGBA()
方法返回 16 位 R、G、B、A,但您將它們視為 8 位值。
其次,值是 alpha 預乘的,因此) 而不是color.RGBA
的倒數。這可能不相關,因為看起來您的圖片沒有任何重要的 alpha。(R, G, B, A)
(A-R, A-G, A-B, A
(MAX-R, MAX-G, MAX-B, A)
修復代碼的一種方法是替換它:
r, g, b, a := img.At(x, y).RGBA() c := color.RGBA{uint8(255 - r), uint8(255 - g), uint8(255 - b), uint8(a)}
有了這個:
r, g, b, a := img.At(x, y).RGBA() c := color.RGBA{uint8((a - r)>>8), uint8((a - g)>>8), uint8((a - b)>>8), uint8(a>>8)}
(請注意,您可能會發現,首先將圖像轉換為image.NRGBA
(如果尚未轉換)然后迭代存儲圖像的(非 alpha 預乘)RGBA 通道的底層字節切片比使用更抽象的接口要快得多image
和color
包提供。)
- 1 回答
- 0 關注
- 195 瀏覽
添加回答
舉報
0/150
提交
取消