先看一个简单代码, 它执行后会产生下面的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对象是一个内存中的图片。

Golang 绘图基础- 不同的输出源的更多相关文章

  1. Golang 绘图基础 -绘制简单图形

    前一节讲的是 绘图到不同输出源,请看地址: http://www.cnblogs.com/ghj1976/p/3440856.html 上一节的例子效果是通过设置每一个点的的RGBA属性来实现的,这是 ...

  2. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  3. Direct3D11学习:(七)绘图基础——彩色立方体的绘制

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 在前面的几篇文章中,我们详细介绍了Direct3D渲染所需要的数学基础和渲染管道理论知识.从这篇文章开始,我们就 ...

  4. GoLang之基础

    GoLang之基础 Go是一种并发的.带垃圾回收的.快速编译的语言. 经典的"hello world"入门: package main import "fmt" ...

  5. python基础_格式化输出(%用法和format用法)(转载)

    python基础_格式化输出(%用法和format用法) 目录 %用法 format用法 %用法 1.整数的输出 %o -- oct 八进制%d -- dec 十进制%x -- hex 十六进制 &g ...

  6. windows游戏编程 绘图基础

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22451353 作者:jadeshu   邮箱: jades ...

  7. Golang的基础数据类型-字符型

    Golang的基础数据类型-字符型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符型概述 Go语言中的字符有两种,即uint8类型和rune类型. uint8类型: 我们也 ...

  8. Golang的基础数据类型-整型

    Golang的基础数据类型-整型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.整型概述 Go语言的整数类型一共有10个. int: 默认是有符号(signed)整形,占用空间 ...

  9. C#语言基础— 输入与输出

    C#语言基础— 输入与输出 1.1函数的四要素:名称.输入.输出.加工 1.2主函数:输出语句.输入语句: Static viod Main(string[] stgs)//下划线部分可以自己指定 { ...

随机推荐

  1. 新Android工程src和layout文件夹为空

    问题:SDK和ADT版本冲突 解决方案: 1.菜单->Help->Install  New Software.. 2.在work with放入地址:http://dl-ssl.google ...

  2. FastDFS之java客户端使用

    为了方便应用程序的访问FastDFS,官网提供了fastdfs-client-java,以便更好的与应用程序结合使用. 下载fastdfs-client-java源码添加到项目工程里面,添加配置文件: ...

  3. Java:IO流其他类(字节数组流、字符数组流、数据流、打印流、Properities、对象流、管道流、随机访问、序列流、字符串读写流)

    一.字节数组流: 类 ByteArrayInputStream:在构造函数的时候,需要接受数据源,而且数据源是一个字节数组. 包含一个内部缓冲区,该缓冲区包含从流中读取的字节.内部计数器跟踪 read ...

  4. hive-0.12升级成hive 0.13.1

    安装了0.12之后,听说0.13.1有许多新的特性,包括永久函数,所以想更新成0.13版的(元数据放在mysql中) 2014年8月5日实验成功 hive0.13.1的新特性 新特性详见 http:/ ...

  5. ES6入门之Symbol

    ES5对象属性名都是字符串容易造成属性名的冲突. eg:var a = { name: 'lucy'}; a.name = 'lili';这样就会重写属性 ES6引入了一种新的原始数据类型Symbol ...

  6. shell脚本学习笔记

    1.判断符号:中括号[ ] [ ]进行数据的判断,例如我想知道HOME这个变量是否为空,[ -z "$HOME" ],或者两个字符串是否相等,[ "$HOME" ...

  7. C# 字符流打印类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  8. linux系统的文件和文件类型

    文件 当你创建一个文件的时候,系统保存了有关该文件的全部信息,包括:• 文件的位置.• 文件类型.• 文件长度.• 哪位用户拥有该文件,哪些用户可以访问该文件.• i节点.• 文件的修改时间.• 文件 ...

  9. php-redis中文文档(转)

    phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 很有用;以下是redis官方提供的命令使用技巧: 下载地址如下: https://github.com/ow ...

  10. Git基础(三)

    本章 就开始和大家一起学习第三块内容:远程仓储的使用操作.要参与任何一个 Git 项目的协作,必须要了解该如何管理远程仓库.远程仓库是指托管在网络上的项目仓库,可能会有好多个,其中有些你只能读,另外有 ...