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: }