使用Image.Image或* image.RGBA的Set()方法
今年夏天我正在做一些Go图像包和我的空闲时间练习。使用Image.Image或* image.RGBA的Set()方法
package main import (
"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.RGBA type: *image.RGBA
,但是当它注释掉我得到一个错误说
img.Set undefined (type image.Image has no field or method Set) 我假设我使用反射错误,我仍然完全掌握Go中的整个界面和类型定义。
回答:
reflect.TypeOf(img)为您提供接口img中的值的反射类型,如果它是一个接口。在这种情况下,img是的接口,image.Image其中包含*image.RGBA。
可以通过转换img到*image.RGBA解决您的代码,或更有力,定义与右Set方法的接口类型,并转换img到(该draw.Image接口"image/draw"完全适用于这一点,因为通过@注意DaveC)。如果您不确定png.Decode将始终为您提供.png文件的*image.RGBA,则该接口类型更可取。
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})
回答:
的编译器是正确的,则image.Image类型是一个接口,不包括set()函数。
我不是图像库的专家,但粗略地看看这些类型似乎建议您可以采用图像类型并使用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})
这是对您的类型问题的严格回答,但我没有任何保证它会实现您的最终目标。
回答:
为了扩展 Anonymous' answer:
png.Decode可以创建几个不同的基础的图像类型(*image.Gray,*image.RGBA,*image.Paletted,*image.NRGBA等)中的一个。 它返回它创建的任何图像作为image.Image接口,其中提供对数据的只读访问。
但是,它返回的所有(最?)实际图像类型都实现了用于简单写入访问的Set方法。 您可以安全地测试和使用此方法的方式是通过image/draw包中的现有draw.Image接口。这只是这样的:
// 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)
}
所以,你可以这样做:
3210Playground(显示了一个例子呼吁所有image.Image方法以及Set)。
以上是 使用Image.Image或* image.RGBA的Set()方法 的全部内容, 来源链接: utcz.com/qa/261316.html

