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

  • 相关阅读:
    ionic platform add ios, Error:spawn EACCES
    OC中分类(Category)和扩展(Extension)
    JSON.stringify() 格式化 输出log
    JavaScript 闭包
    vue路由跳转到指定页面
    vue使用路由跳转到上一页
    vue子传父多个值
    vue里router-link标签设置动态路由的3个方法
    地址栏的路由输入不匹配时候,设置默认跳转页面(redirect)
    把router-link标签渲染成指定的标签
  • 原文地址:https://www.cnblogs.com/ghj1976/p/3440856.html
Copyright © 2020-2023  润新知