先看一个简单代码, 它执行后会产生下面的300*500的png图片文件:
代码:
1: package main
2:
3: import (
4: "fmt"
5: "image"
6: "image/color"
7: "image/png"
8: "log"
9: "os"
10: )
11:
12: func main() {
13: const (
14: dx = 300
15: dy = 500
16: )
17:
18: // 需要保存的文件
19: imgcounter := 123
20: imgfile, _ := os.Create(fmt.Sprintf("%03d.png", imgcounter))
21: defer imgfile.Close()
22:
23: // 新建一个 指定大小的 RGBA位图
24: img := image.NewNRGBA(image.Rect(0, 0, dx, dy))
25:
26: for y := 0; y < dy; y++ {
27: for x := 0; x < dx; x++ {
28: // 设置某个点的颜色,依次是 RGBA
29: img.Set(x, y, color.RGBA{uint8(x % 256), uint8(y % 256), 0, 255})
30: }
31: }
32:
33: // 以PNG格式保存文件
34: err := png.Encode(imgfile, img)
35: if err != nil {
36: log.Fatal(err)
37: }
38:
39: }
我们再看一个代码,以http文件流的方式展示图片,效果如下:
1: package main
2:
3: import (
4: "image"
5: "image/color"
6: "image/png"
7: "net/http"
8: "time"
9: )
10:
11: func pic(w http.ResponseWriter, req *http.Request) {
12: const (
13: dx = 300
14: dy = 500
15: )
16:
17: // 新建一个 指定大小的 RGBA位图
18: img := image.NewNRGBA(image.Rect(0, 0, dx, dy))
19:
20: for y := 0; y < dy; y++ {
21: for x := 0; x < dx; x++ {
22: // 设置某个点的颜色,依次是 RGBA
23: img.Set(x, y, color.RGBA{uint8(x % 256), uint8(y % 256), 0, 255})
24: }
25: }
26:
27: // 图片流方式输出
28: w.Header().Set("Content-Type", "image/png")
29: png.Encode(w, img)
30: }
31:
32: func main() {
33: http.HandleFunc("/", pic)
34: s := &http.Server{
35: Addr: ":82",
36: ReadTimeout: 30 * time.Second,
37: WriteTimeout: 30 * time.Second,
38: MaxHeaderBytes: 1 << 20}
39: s.ListenAndServe()
40:
41: }
通过两种方式来展示图片,我们可以看到,上面两个代码最大的区别就是输出源不一样, 一个是到文件,一个是到http流. 而我们的代码也很清晰的展示了这两种方式只需要修改对应的实现即可.其他代码是没有变化的.
这里代码中的 image.NewNRGBA 返回的 image对象是一个内存中的图片。