1: package main
   2:  
   3: import (
   4:     "fmt"
   5:     "image"
   6:     "image/color"
   7:     "image/png"
   8:     "log"
   9:     "os"
  10: )
  11:  
  12: // Putpixel describes a function expected to draw a point on a bitmap at (x, y) coordinates.
  13: type Putpixel func(x, y int)
  14:  
  15: // 求绝对值
  16: func abs(x int) int {
  17:     if x >= 0 {
  18:         return x
  19:     }
  20:     return -x
  21: }
  22:  
  23: // Bresenham's algorithm, http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
  24: // https://github.com/akavel/polyclip-go/blob/9b07bdd6e0a784f7e5d9321bff03425ab3a98beb/polyutil/draw.go
  25: // TODO: handle int overflow etc.
  26: func drawline(x0, y0, x1, y1 int, brush Putpixel) {
  27:     dx := abs(x1 - x0)
  28:     dy := abs(y1 - y0)
  29:     sx, sy := 1, 1
  30:     if x0 >= x1 {
  31:         sx = -1
  32:     }
  33:     if y0 >= y1 {
  34:         sy = -1
  35:     }
  36:     err := dx - dy
  37:  
  38:     for {
  39:         brush(x0, y0)
  40:         if x0 == x1 && y0 == y1 {
  41:             return
  42:         }
  43:         e2 := err * 2
  44:         if e2 > -dy {
  45:             err -= dy
  46:             x0 += sx
  47:         }
  48:         if e2 < dx {
  49:             err += dx
  50:             y0 += sy
  51:         }
  52:     }
  53: }
  54:  
  55: func main() {
  56:  
  57:     const (
  58:         dx = 300
  59:         dy = 500
  60:     )
  61:  
  62:     // 需要保存的文件
  63:  
  64:     // 新建一个 指定大小的 RGBA位图
  65:     img := image.NewNRGBA(image.Rect(0, 0, dx, dy))
  66:  
  67:     drawline(5, 5, dx-8, dy-10, func(x, y int) {
  68:         img.Set(x, y, color.RGBA{uint8(x), uint8(y), 0, 255})
  69:     })
  70:  
  71:     // 左右都画一条竖线
  72:     for i := 0; i < dy; i++ {
  73:         img.Set(0, i, color.Black)
  74:         img.Set(dx-1, i, color.Black)
  75:     }
  76:  
  77:     imgcounter := 250
  78:     imgfile, _ := os.Create(fmt.Sprintf("%03d.png", imgcounter))
  79:     defer imgfile.Close()
  80:  
  81:     // 以PNG格式保存文件
  82:     err := png.Encode(imgfile, img)
  83:     if err != nil {
  84:         log.Fatal(err)
  85:     }
  86: }