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)。

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})

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)。
- 3 回答
- 0 關(guān)注
- 288 瀏覽
添加回答
舉報