第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

使用 image/jpeg 編碼導致圖像飽和/錯誤像素

使用 image/jpeg 編碼導致圖像飽和/錯誤像素

Go
HUX布斯 2023-01-03 13:49:57
我遇到這個問題已經(jīng)有一段時間了:我正在創(chuàng)建一個模塊來處理圖像,我的功能之一是遍歷圖像的每個像素并反轉(zhuǎn)顏色。該函數(shù)在編碼 .png 圖像時返回預期結(jié)果,但它“飽和”了 .jpeg/jpg 圖像。處理 .png 圖像時的示例(正確):https ://i.imgur.com/DG35RsR.png處理 .jpeg 圖像時的示例(錯誤):https ://i.imgur.com/DZQmxJ2.png我正在研究并發(fā)現(xiàn)最接近我的問題,雖然這不是答案,但這個問題來自 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條經(jīng)驗 獲得超4個贊

您的代碼中有兩個與顏色處理相關的錯誤(第二個可能不相關)。

首先,該RGBA()方法返回 16 位 R、G、B、A,但您將它們視為 8 位值。

其次,值是 alpha 預乘的,因此) 而不是color.RGBA的倒數(shù)。這可能不相關,因為看起來您的圖片沒有任何重要的 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)}

(請注意,您可能會發(fā)現(xiàn),首先將圖像轉(zhuǎn)換為image.NRGBA(如果尚未轉(zhuǎn)換)然后迭代存儲圖像的(非 alpha 預乘)RGBA 通道的底層字節(jié)切片比使用更抽象的接口要快得多imagecolor包提供。)


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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號