008-绘制三角函数图像(二)
本文我们再介绍一种 in-memory image 的类型,叫 Paletted
,然后再使用这种类型的 in-memory 来绘制三角函数图像。
定义如下:
图1 Paletted 类型
Paletted 的中文含义是调色板,相信大家都见过。
图2 调色板
调色板上放有很多种不同颜色的颜料,这都是事先调好的,然后放在板子上面。在 go 语言里,Paletted 类型也扮演着类似的角色,如果你想使用 Paletted,也需要事先构造好很多颜色值,放到调色板上去。最后想使用某种颜色的时候,就可以说,我想使用 3 号颜色,我想使用 4 号颜色,而不是说我想使用绿色,使用浅绿色了。
我们使用下面的函数来创建一个调色板:
func NewPaletted(r Rectangle, p color.Palette) *Paletted
其中,color.Palette
定义如下:
type Palette []Color
这像极了 C 语言里给类型取别名的操作 typedef
,如果要写成 C 语法,就是这样的:
typedef Color[]
接下来,我们只需要构造一个 []Color 的 slice 对象就可以使用 NewPaletted
来创建调色板啦。
palette := []color.Color{color.White, color.RGBA{255, 0, 0, 0}}
rec := image.Rect(0, 0, 2*size, 2*size)
image := image.NewPaletted(rec, palette)
最后,再给 in-memory 上色的时候,就可以直接使用调色板上的颜色了。这个函数是:
func (p *Paletted) SetColorIndex(x, y int, index
它的第三个参数表示调色板上的颜色位置。
最后注意了,创建出来的 in-memory 的默认颜色是调色板第 0 号颜色。
2. 完整代码package main3. 总结掌握 Paletted 使用方法
import (
"fmt"
"image"
"image/color"
"image/jpeg"
"math"
"os"
)
const (
size = 128
)
func main() {
palette := []color.Color{color.White, color.RGBA{255, 0, 0, 0}}
rec := image.Rect(0, 0, 2*size, 2*size)
// 画布的颜色默认就是白色了,因为第 0 号颜色是白色。
image := image.NewPaletted(rec, palette)
for t := 0.0; t < 2*math.Pi; t += 0.001 {
x := int(2.0*size*t/(2.0*math.Pi) + 0.5)
y := int(size + 100*math.Sin(t) + 0.5)
image.SetColorIndex(x, 2*size-y, 1)
}
// 这里我们使用 jpeg 编码器来生成 jpg 图像
options := jpeg.Options{Quality: 100}
err := jpeg.Encode(os.Stdout, image, &options)
if err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
}
}
练习:给调色板增加更多的颜色。
版权声明
本文仅代表作者观点,不代表博信信息网立场。