ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
[TOC] ## image - image实现了基本的2D图片库 - Image接口可以通过调用如NewRGBA和NewPaletted函数等获得 - Decode函数解码包含GIF、JPEG或PNG格式图像数据的输入流获得 - 解码任何具体图像类型之前都必须注册对应类型的解码函数。注册过程一般是作为包初始化的副作用(类似mysql) ``` import _ "image/png" ``` 语法 ``` type Point func Pt(X, Y int) Point func (p Point) Eq(q Point) bool func (p Point) Add(q Point) Point func (p Point) Sub(q Point) Point func (p Point) Mul(k int) Point func (p Point) Div(k int) Point func (p Point) In(r Rectangle) bool func (p Point) Mod(r Rectangle) Point func (p Point) String() string // 矩形 type Rectangle func Rect(x0, y0, x1, y1 int) Rectangle func (r Rectangle) Canon() Rectangle func (r Rectangle) Dx() int func (r Rectangle) Dy() int func (r Rectangle) Size() Point func (r Rectangle) Empty() bool func (r Rectangle) Eq(s Rectangle) bool func (r Rectangle) In(s Rectangle) bool func (r Rectangle) Overlaps(s Rectangle) bool func (r Rectangle) Add(p Point) Rectangle func (r Rectangle) Sub(p Point) Rectangle func (r Rectangle) Intersect(s Rectangle) Rectangle func (r Rectangle) Union(s Rectangle) Rectangle func (r Rectangle) Inset(n int) Rectangle func (r Rectangle) String() string type Uniform func NewUniform(c color.Color) *Uniform func (c *Uniform) At(x, y int) color.Color func (c *Uniform) Bounds() Rectangle func (c *Uniform) ColorModel() color.Model func (c *Uniform) Convert(color.Color) color.Color func (c *Uniform) Opaque() bool func (c *Uniform) RGBA() (r, g, b, a uint32) type 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覆盖的子图像,父图像和子图像公用像素 // 以下类型都还有 type Alpha 的方法 type Gray16 type Gray type RGBA64 type RGBA type Alpha16 type NRGBA type NRGBA64 type Paletted type YCbCr ``` ### image.Rect 生成矩形 ``` image.Rect(0, 0, 500, 200) ``` ### image.Point ``` func main() { pt := image.Point{X: 5, Y: 5} fmt.Println(pt) //(5,5) ,输出一个点位置(X,Y) fmt.Println(image.Pt(1, 2)) //(1,2) ,Pt输出一个点位置的简写形式 fmt.Println(pt.Add(image.Pt(1, 1))) //(6,6),两个点求和 fmt.Println(pt.String()) //(5,5) ,以字符串形式输出点 fmt.Println(pt.Eq(image.Pt(5, 5))) //true,判断两个点是否完全相等 fmt.Println(pt.In(image.Rect(0, 0, 10, 10))) //true,判断一个点是否在矩阵中 fmt.Println(pt.Div(2)) //(2,2),求点的商   fmt.Println(pt.Mul(2)) // (10,10),求点的乘积 fmt.Println(pt.Sub(image.Pt(1, 1))) // (4,4),求两个点的差fmt.Println(pt.Mod(image.Rect(9, 8, 10, 10))) // (9,9),dx=10-9=1,dy=10-8=2,9-5=4,4是1和2的倍数并且(9,9)在矩阵中 } ``` ### image.NewAlpha / Alpha16 利用给定矩形边界产生一个alpha ``` 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信息写入文件中 ``` ## 示例 ### ``` func main() { file, err := os.Create("test.jpg") if err != nil { log.Fatal(err) } defer file.Close() rgba := image.NewRGBA(image.Rect(0, 0, dx, dy)) for x := 0; x < dx; x++ { for y := 0; y < dy; y++ { rgba.Set(x, y, color.NRGBA{uint8(x % 256), uint8(y % 256), 0, 255}) } } fmt.Println(rgba.At(400, 100)) //{144 100 0 255} fmt.Println(rgba.Bounds()) //(0,0)-(500,200) fmt.Println(rgba.Opaque()) //true,其完全透明 fmt.Println(rgba.PixOffset(1, 1)) //2004 fmt.Println(rgba.Stride) //2000 jpeg.Encode(file, rgba, nil) //将image信息存入文件中 } ```