image
最后更新于:2022-04-02 02:44:03
[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信息存入文件中
}
```
';