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") } } } ```
';