draw 图像合成函数
最后更新于:2022-04-02 02:44:10
[TOC]
> [有价值的参考博客](https://blog.golang.org/image-draw)
## draw
语法
```
// dst 绘图的背景图。
// r 是背景图的绘图区域
// src 是要绘制的图
// sp 是 src 对应的绘图开始点(绘制的大小 r变量定义了)
// mask 是绘图时用的蒙版,控制替换图片的方式。
// mp 是绘图时蒙版开始点(绘制的大小 r变量定义了)
// op Op is a Porter-Duff compositing operator
func DrawMask(dst Image, r image.Rectangle, src image.Image, sp image.Point, mask image.Image, mp image.Point, op Op)
// 第函数Draw是没有使用蒙版mask的调用方法,它内部其实就是调用的mask为 nil的方法。
func Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point, op Op) {
```
## 示例
### 矩形填充颜色
```
m := image.NewRGBA(image.Rect(0, 0, 640, 480))
blue := color.RGBA{B: 255, A: 255}
draw.Draw(m, m.Bounds(), &image.Uniform{C: blue}, image.ZP, draw.Src)
```
### 拷贝图片的一部分
```
r := image.Rectangle{Min: dp, Max: dp.Add(sr.Size())} // 获得更换区域
draw.Draw(dst, r, src, sr.Min, draw.Src)
```
### 复制整个图片
```
func main() {
const width = 130
const height = 50
im := image.NewGray(image.Rectangle{Max: image.Point{X: width, Y: height}})
for x := 0; x < width; x++ {
for y := 0; y < height; y++ {
dist := math.Sqrt(math.Pow(float64(x-width/2), 2)/3+math.Pow(float64(y-height/2), 2)) / (height / 1.5) * 255
var gray uint8
if dist > 255 {
gray = 255
} else {
gray = uint8(dist)
}
im.SetGray(x, y, color.Gray{Y: 255 - gray})
}
}
pi := image.NewPaletted(im.Bounds(), []color.Color{
color.Gray{Y: 255},
color.Gray{Y: 160},
color.Gray{Y: 70},
color.Gray{Y: 35},
color.Gray{Y: 0},
})
draw.DrawMask()
draw.FloydSteinberg.Draw(pi, im.Bounds(), im, image.ZP)
shade := []string{" ", "░", "▒", "▓", "█"}
for i, p := range pi.Pix {
fmt.Print(shade[p])
if (i+1)%width == 0 {
fmt.Print("\n")
}
}
}
```
';