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

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

使用 image.Image 或 *image.RGBA 的 Set() 方法

使用 image.Image 或 *image.RGBA 的 Set() 方法

Go
手掌心 2021-10-04 17:37:56
今年夏天的空閑時間,我正在用 Go 圖像包做一些練習(xí)。package mainimport (    "os"    "image"    "image/png"    "image/color"    "log"    "fmt"    "reflect")func main(){    file , err := os.OpenFile("C:/Sources/go3x3.png", os.O_RDWR, os.FileMode(0777))    if err != nil {        log.Fatal(err)    }    img , err := png.Decode(file)    if err != nil {        log.Fatal(err)    }    img.At(0,0).RGBA()    fmt.Println("type:", reflect.TypeOf(img))    m := image.NewRGBA(image.Rect(0, 0, 640, 480))    fmt.Println("type:", reflect.TypeOf(m))    m.Set(5, 5, color.RGBA{255, 0, 0, 255})    img.Set(0, 0, color.RGBA{136, 0, 21, 255})}這里的問題是當(dāng)我用img.Set注釋掉運行它時,我得到了這個結(jié)果type: *image.RGBAtype: *image.RGBA但是當(dāng)它取消注釋時,我收到一條錯誤消息img.Set undefined (type image.Image has no field or method Set)我假設(shè)我使用的是反射錯誤,我仍然完全掌握了 Go 中的整個接口和類型定義。
查看完整描述

3 回答

?
四季花海

TA貢獻1811條經(jīng)驗 獲得超5個贊

png.Decode可以創(chuàng)建多個不同的基礎(chǔ)圖像類型中的一種(*image.Gray,*image.RGBA,*image.Paletted,*image.NRGBA,等等)。它返回它作為image.Image接口創(chuàng)建的任何圖像,該接口提供對數(shù)據(jù)的只讀訪問。


但是,它返回的所有(大多數(shù)?)實際圖像類型都實現(xiàn)了Set簡單寫訪問的方法。您可以安全地測試和使用此方法的方法是通過包中的現(xiàn)有draw.Image接口image/draw。就是這樣:


// From image/draw:

// Image is an image.Image with a Set method to change a single pixel.

type Image interface {

        image.Image

        Set(x, y int, c color.Color)

}

所以你可以這樣做:


func drawablePNGImage(r io.Reader) (draw.Image, error) {

    img, err := png.Decode(r)

    if err != nil {

        return nil, err

    }

    dimg, ok := img.(draw.Image)

    if !ok {

        return nil, fmt.Errorf("%T is not a drawable image type", img)

    }

    return dimg, nil

}

Playground(顯示了一個調(diào)用所有image.Image方法以及的示例Set)。


查看完整回答
反對 回復(fù) 2021-10-04
?
神不在的星期二

TA貢獻1963條經(jīng)驗 獲得超6個贊

reflect.TypeOf(img)img如果它是一個接口,則為您提供 interface 中值的反射類型。在這種情況下,img 是一個接口,image.Image其中包含一個*image.RGBA.


您可以通過轉(zhuǎn)換img為來修復(fù)代碼*image.RGBA,或者更健壯地使用正確的Set方法定義接口類型,然后轉(zhuǎn)換img為該類型(正如@DaveC 所指出的,該draw.Image接口"image/draw"非常適合于此)。如果您不確定接口類型是否png.Decode總是為您*image.RGBA提供的 .png 文件,則接口類型更可取。


img.(*image.RGBA).Set(0, 0, color.RGBA{136, 0, 21, 255})

或者


type Setter interface {

    Set(x, y int, c color.Color)

}


img.(Setter).Set(0, 0, color.RGBA{136, 0, 21, 255})

或(可能是最好的):


import "image/draw"


...


img.(draw.Image).Set(0, 0, color.RGBA{136, 0, 21, 255})


查看完整回答
反對 回復(fù) 2021-10-04
?
暮色呼如

TA貢獻1853條經(jīng)驗 獲得超9個贊

所述編譯器是正確時,image.Image類型是不包括集()函數(shù)的接口。


我不是圖像庫的專家,但我對類型的粗略觀察似乎表明您可以采用 Image 類型并使用該Bounds()方法獲取image.Rectangle以創(chuàng)建新的 RGBA 類型,如之前在示例代碼中所做的那樣。


// Your current image manipulation

m := image.NewRGBA(image.Rect(0, 0, 640, 480))

fmt.Println("type:", reflect.TypeOf(m))

m.Set(5, 5, color.RGBA{255, 0, 0, 255})


// You can create a image.RGBA type by passing the image.Rectangle

// returned from image.Image.Bounds()

m = image.NewRGBA(img.Bounds())

m.Set(0, 0, color.RGBA{136, 0, 21, 255})

這是對您的類型問題的嚴(yán)格回答,但我沒有任何保證它可以實現(xiàn)您的最終目標(biāo)。


查看完整回答
反對 回復(fù) 2021-10-04
  • 3 回答
  • 0 關(guān)注
  • 288 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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