Go程序设计语言1.4 GIF动画-阿里云开发者社区

开发者社区> 华章计算机> 正文

Go程序设计语言1.4 GIF动画

简介:
+关注继续查看

1.4 GIF动画


下一个程序展示Go标准的图像包的使用,用来创建一系列的位图图像,然后将位图序列编码为GIF动画。下面的图像叫作利萨茹图形,是20世纪60年代科幻片中的纤维状视觉效果。利萨茹图形是参数化的二维谐振曲线,如示波器x轴和y轴馈电输入的两个正弦波。图1-1是几个示例。

 

图1-1 四种利萨茹图形

这段代码里有几个新的组成,包括const声明、结构体以及复合字面量。不像大多数例子,本例还引入了浮点运算。这个示例的主要目的是提供一些思路,表明Go语言看起来是怎样的,以及利用Go语言和它的库可以轻易完成哪些事情,这里只简短地讨论这几个主题,更多细节将放在后面章节。

 

 

    rand.Seed(time.Now().UTC().UnixNano())

    if len(os.Args) > 1 && os.Args[1] == "web" {

            handler := func(w http.ResponseWriter, r *http.Request) {

                lissajous(w)

            }

            http.HandleFunc("/", handler)

            log.Fatal(http.ListenAndServe("localhost:8000", nil))

            return

    }

 

 

在导入那些由多段路径如image/color组成的包之后,使用路径最后的一段来引用这个包。所以变量color.White属于image/color包,gif.GIF属于image/gif包。

const声明(参考3.6节)用来给常量命名,常量是其值在编译期间固定的量,例如周期、帧数和延迟等数值参数。与var声明类似,const声明可以出现在包级别(所以这些常量名字在包生命周期内都是可见的)或在一个函数内(所以名字仅在函数体内可见)。常量必须是数字、字符串或布尔值。

表达式[]color.Color{...}和gif.GIF{...}是复合字面量(参考4.2节、4.4.1节),即用一系列元素的值初始化Go的复合类型的紧凑表达方式。这里,第一个是slice,第二个是结构体。

gif.GIF是一个结构体类型(参考4.4节)。结构体由一组称为字段的值组成,字段通常有不同的数据类型,它们一起组成单个对象,作为一个单位被对待。anim变量是gif.GIF结构体类型。这个结构体字面量创建一个结构体LoopCount,其值设置为nframes;其他字段的值是对应类型的零值。结构体的每个字段可以通过点记法来访问,在最后两个赋值语句中,显式更新anim结构体的Delay和Image字段。

lissajous函数有两个嵌套的循环。外层有64个迭代,每个迭代产生一个动画帧。它创建一个201×201大小的画板,使用黑和白两种颜色。所有的像素值默认设置为0(画板中的初始化颜色),这里设置为白色。每一个内层循环通过设置一些像素为黑色产生一个新的图像。结果使用内置的append参数将其追加到anim的帧列表中,并且指定80ms的延迟。最后帧和延迟的序列被编码成GIF格式,然后写入输出流out。out的类型是io.Writer,它可以帮我们输出到很多地方,稍后即可看到。

外层循环运行两个振荡器。x方向的振荡器是正弦函数,y方向也是正弦化的,但是它的频率相对于x的振动周期是0~3之间的一个随机数,它的相位相对于x的初始值为0,然后随着每个动画帧增加。该循环在x振荡器完成5个完整周期后停止。每一步它都调用SetColorIndex将对应画板上面的(x, y)位置涂为黑色,在画板上的值为1。

main函数调用lissajous函数,直接写到标准输出,所以这个命令产生一个像图1-1那样的GIF动画:

 

练习1.5:改变利萨茹程序的画板颜色为绿色黑底来增加真实性。使用color.RGBA {0xRR,0xGG,0xBB,0xff}创建一种Web颜色#RRGGBB,每一对十六进制数字表示组成一个像素红、绿、蓝分量的亮度。

练习1.6:通过在画板中添加更多颜色,然后通过有趣的方式改变SetColorIndex的第三个参数,修改利萨茹程序来产生多种色彩的图片。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
30个带给你灵感的 iPhone 应用程序网站设计
  这篇文章向大家分享30个漂亮的 iPhone 应用程序网站设计作品,希望这些实例能带给你灵感,一起欣赏。 Routes Camera + Decrescendo Interface Diet2Go Task This Grades Headquarte...
610 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4617 0
多线程程序设计学习(2)之single threaded execution pattern
Single Threaded Execution Pattern【独木桥模式】一:single threaded execution pattern的参与者--->SharedResource(共享资源)二:single threaded execution pattern模式什么时候使用--->多线程程序设计时--->数据可被多个线程访问的时候--->共享资源状态可能变化的时候--->需要确保数据安全性的时候三:single threaded execution pattern思考--->synchronized一见到它,势必保护着什么公共资源的数据。
863 0
多线程程序设计学习(7)read-write lock pattern
Read-Write Lock Pattern【读写】一:Read-Write Lock Pattern的参与者--->读写锁--->数据(共享资源)--->读线程--->写线程       二Read-Write Lock Pattern模式什么时候使用---> * 为了多线线程环境下保护数据安全,我们必须避免的冲突 * 一个线程读取,另一个线程写入的read-write conflick * 一个线程写入,另一个线程写入的write-write conflick * 一个线程读取,另一个线程也在读取不会产生冲突 *  * 当线程想要获取读取锁定时: * -->已经有线程在执行写入,则等待。
758 0
多线程程序设计学习(13)Active Object pattern
Active Object[接收异步消息的对象]一:Active Object的参与者--->客户端线程(发起某种操作请求处理)--->代理角色(工头)--->实际执行者(工人)--->主动对象接口(工人和工头)--->生产端线程(加工产品的线程)--->存放生产请求的队列(存放请求的队列)--->...
631 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载