• Golang 绘图基础- 不同的输出源


    先看一个简单代码, 它执行后会产生下面的300*500的png图片文件:

    123

    代码:

       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文件流的方式展示图片,效果如下:

    image

    代码如下:

       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对象是一个内存中的图片。

  • 相关阅读:
    基于C语言的高斯曲线拟合原理以及实现【转】
    高斯曲线拟合原理及实现
    软件测试Lab2————用selenium进行自动化测试
    软件测试作业四 —— 课后习题七及扩展
    软件测试作业三—— 上机实验判断三角形的类型
    软件项目管理作业一 —— 描述项目
    软件测试作业二 —— 对于Faults,Errors,Failures的认识的习题
    软件测试作业一 —— 记录我遇到的项目error
    The introduction about my project.
    课程表WPF制作 学习步骤三
  • 原文地址:https://www.cnblogs.com/ghj1976/p/3440856.html
Copyright © 2020-2023  润新知