image包实现了一个基本的2D图像库,该包中包含基本的接口叫做image,这个里面包含color,这个将在image/color中描述,
image接口的值创建方式有如下几种:
1调用NewRGBA和NewPaletted
2解码一个包含gif.jpen或者png格式的image数据的io.Reader
首先介绍一些image接口
type Image //image是一个从颜色模型中采取color.Color的矩形网格
type Image interface {
ColorModel() color.Model //ColorModel 返回图片的 color.Model
Bounds() Rectangle //图片中非0color的区域
At(x, y int) color.Color //返回指定点的像素color.Color
}
任何一个struct只要实现了image中的三个方法,便实现了image接口
func Decode(r io.Reader) (Image, string, error) //Decode对一个根据指定格式进行编码的图片进行解码操作,string返回的是在注册过程中使用的格式化名字,如"gif"或者"jpeg"等.
func RegisterFormat(name, magic string, decode func(io.Reader) (Image, error), decodeConfig func(io.Reader) (Config, error))
RegisterFormat注册一个image格式给解码使用,name是格式化名字,例如"jpeg"或者"png",magic标明格式化编码的前缀,magic字符串中能够包含一个?字符,用来匹配任何一个字符,decode是用来解码"编码图像"的函数,DecodeConfig是一个仅仅解码它的配置的函数.
type Alpha //用来设置图片的透明度
type Alpha struct {
Pix []uint8 // Pix 存储图片的像素 ,像 alpha 值. 在(X,Y)的像素 starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*1].
Stride int // Stride 表示垂直两个像素之间的步幅(距离)
Rect Rectangle // Rect 表示 图片边界.
}
func NewAlpha(r Rectangle) *Alpha //利用给定矩形边界产生一个alpha
func (p *Alpha) AlphaAt(x, y int) color.Alpha //获取指定点的透明度
func (p *Alpha) At(x, y int) color.Color //获取指定点的color(指定点的红绿蓝的透明度)
func (p *Alpha) Bounds() Rectangle //获取alpha的边界
func (p *Alpha) ColorModel() color.Model //获取alpha的颜色模型
func (p *Alpha) Opaque() bool //检查alpha是否完全不透明
func (p *Alpha) PixOffset(x, y int) int //获取指定像素相对于第一个像素的相对偏移量
func (p *Alpha) Set(x, y int, c color.Color) //设定指定位置的color
func (p *Alpha) SetAlpha(x, y int, c color.Alpha) //设定指定位置的alpha
func (p *Alpha) SubImage(r Rectangle) Image //获取p图像中被r覆盖的子图像,父图像和子图像公用像素
下面举例说明其用法:
package main
import (
"fmt"
"image"
"image/color"
"image/jpeg"
"log"
"os"
)
const (
dx = 500
dy = 200
)
func main() {
file, err := os.Create("test.jpeg")
if err != nil {
log.Fatal(err)
}
defer file.Close()
alpha := image.NewAlpha(image.Rect(0, 0, dx, dy))
for x := 0; x < dx; x++ {
for y := 0; y < dy; y++ {
alpha.Set(x, y, color.Alpha{uint8(x % 256)}) //设定alpha图片的透明度
}
}
fmt.Println(alpha.At(400, 100)) //144 在指定位置的像素
fmt.Println(alpha.Bounds()) //(0,0)-(500,200),图片边界
fmt.Println(alpha.Opaque()) //false,是否图片完全透明
fmt.Println(alpha.PixOffset(1, 1)) //501,指定点相对于第一个点的距离
fmt.Println(alpha.Stride) //500,两个垂直像素之间的距离
jpeg.Encode(file, alpha, nil) //将image信息写入文件中
}
得到的图形如下所示:
由于每种类型其方法类似,下面不再距离说明。
type Alpha16
type Alpha16 struct {
// Pix holds the image's pixels, as alpha values in big-endian format. The pixel at
// (x, y) starts at Pix[(y-Rect.Min.Y)*Stride + (x-Rect.Min.X)*2]. 大端模式,所以像素计算和alpha不同
Pix []uint8
// Stride is the Pix stride (in bytes) between vertically adjacent pixels.
Stride int
// Rect is the image's bounds.
Rect Rectangle
}
其中alpha16中方法用法与alpha中方法用法类似,这里不再赘述.
func NewAlpha16(r