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

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

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

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

Go
手掌心 2021-10-04 17:37:56
今年夏天的空閑時間,我正在用 Go 圖像包做一些練習。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})}這里的問題是當我用img.Set注釋掉運行它時,我得到了這個結果type: *image.RGBAtype: *image.RGBA但是當它取消注釋時,我收到一條錯誤消息img.Set undefined (type image.Image has no field or method Set)我假設我使用的是反射錯誤,我仍然完全掌握了 Go 中的整個接口和類型定義。
查看完整描述

3 回答

?
四季花海

TA貢獻1811條經驗 獲得超5個贊

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


但是,它返回的所有(大多數?)實際圖像類型都實現了Set簡單寫訪問的方法。您可以安全地測試和使用此方法的方法是通過包中的現有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(顯示了一個調用所有image.Image方法以及的示例Set)。


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

TA貢獻1963條經驗 獲得超6個贊

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


您可以通過轉換img為來修復代碼*image.RGBA,或者更健壯地使用正確的Set方法定義接口類型,然后轉換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})


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

TA貢獻1853條經驗 獲得超9個贊

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


我不是圖像庫的專家,但我對類型的粗略觀察似乎表明您可以采用 Image 類型并使用該Bounds()方法獲取image.Rectangle以創建新的 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})

這是對您的類型問題的嚴格回答,但我沒有任何保證它可以實現您的最終目標。


查看完整回答
反對 回復 2021-10-04
  • 3 回答
  • 0 關注
  • 301 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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