我目前正在尝试创建一个图像,其中调色板从已知尺寸的 png 文件的第一行读取。我通过声明一个已知大小的颜色数组来实现这一点,然后设置
我目前正在尝试创建一个图像,其中调色板从已知尺寸的 png 文件的第一行读取。我通过声明一个 Color
已知大小的数组,然后分别设置该数组中的条目,然后将该数组 image.NewPaletted
作为调色板参数传递进去来实现这一点。我从 Donovan & Kernighan 的例子中知道以下内容有效:
var palette = []color.Color{color.White, color.Black}
rect := image.Rect(0, 0, 200, 200)
img := image.NewPaletted(rect, palette)
...但以下在我的代码中不起作用(我已经检查了错误 os.Open
但 png.Decode
为了简洁起见省略了这一点):
file, _ := os.Open("palette.png")
img, _ := png.Decode(file)
// image width is guaranteed to == paletteSize
var palette [paletteSize]color.Color
for i := range(paletteSize) {
palette[i] = img.At(i, 0)
}
rect := image.Rect(0, 0, 200, 200)
img := image.NewPaletted(rect, palette)
失败了 cannot use palette (variable of type [256]color.Color) as color.Palette value in argument to image.NewPaletted
。值得注意的是, 文档 显示 color.Palette
定义为 type Palette []Color
.
感觉这两个数组应该是等价的,因为它们的大小显然都是已知的,只是初始化方式不同,但显然我错过了一些东西。我尝试将其减少 paletteSize
到 2,但仍然会抛出相同的错误,所以我认为这不是数组大小的问题。有人知道我做错了什么吗?
[256]color.Color
是一个 数组 ,而 color.Palette
定义为 type Palette []Color
,所以 是一个 切片 。这意味着您正在尝试将数组传递给需要切片的函数;错误会让您知道不支持此功能。
您有几个选择;最小的变化是使用 image.NewPaletted(rect, palette[:])
(这将创建一个使用数组作为底层缓冲区 ref )。或者,您也可以只使用切片:
func main() {
file, _ := os.Open("palette.png")
img, _ := png.Decode(file)
paletteSize:= 256
palette := make([]color.Color, paletteSize)
for i := range paletteSize {
palette[i] = img.At(i, 0)
}
rect := image.Rect(0, 0, 200, 200)
_ = image.NewPaletted(rect, palette)
}