Golang 的图片出来通过提供操作每一个像素点设置颜色(http://www.cnblogs.com/ghj1976/p/3441536.html) 和 提供通过可选蒙版图片重叠操作 (http://www.cnblogs.com/ghj1976/p/3443638.html) 这两种基础方式,这样任何想要的效果都可以自己实现, 但是旋转、缩放等相关的图像算法也是比较麻烦的,这时候我们就需要借助官方提供的图片包处理了,图片包在:https://code.google.com/p/graphics-go

获取方法: go get code.google.com/p/graphics-go/graphics

它支持的几个效果举例:

 

图片旋转

效果:一个旋转前,一个旋转后

代码例子:

   1: package main

   2:  

   3: import (

   4:     "code.google.com/p/graphics-go/graphics"

   5:     "fmt"

   6:     "image"

   7:     "image/png"

   8:     "log"

   9:     "os"

  10: )

  11:  

  12: func main() {

  13:     src, err := LoadImage("348.png")

  14:     if err != nil {

  15:         log.Fatal(err)

  16:     }

  17:  

  18:     dst := image.NewRGBA(image.Rect(0, 0, 350, 400))

  19:  

  20:     err = graphics.Rotate(dst, src, &graphics.RotateOptions{3.5})

  21:     if err != nil {

  22:         log.Fatal(err)

  23:     }

  24:  

  25:     // 需要保存的文件

  26:     imgcounter := 123

  27:     saveImage(fmt.Sprintf("%03d.png", imgcounter), dst)

  28: }

  29:  

  30: // LoadImage decodes an image from a file.

  31: func LoadImage(path string) (img image.Image, err error) {

  32:     file, err := os.Open(path)

  33:     if err != nil {

  34:         return

  35:     }

  36:     defer file.Close()

  37:     img, _, err = image.Decode(file)

  38:     return

  39: }

  40:  

  41: // 保存Png图片

  42: func saveImage(path string, img image.Image) (err error) {

  43:     // 需要保存的文件

  44:     imgfile, err := os.Create(path)

  45:     defer imgfile.Close()

  46:  

  47:     // 以PNG格式保存文件

  48:     err = png.Encode(imgfile, img)

  49:     if err != nil {

  50:         log.Fatal(err)

  51:     }

  52:     return

  53: }

代码说明:

旋转的参数是顺时针旋转的弧度,弧度相关的介绍如下:

http://youthpasses.blog.51cto.com/2909834/799353

每个角度对应的弧度可以看下面图。

代码参考:http://stackoverflow.com/questions/12430874/image-manipulation-in-golang

图片模糊处理

效果:

下面一个是清晰版本,一个是模糊出来后的版本。

仔细对比细节是可以看到模糊效果的。

代码:

   1: package main

   2:  

   3: import (

   4:     "code.google.com/p/graphics-go/graphics"

   5:     "fmt"

   6:     "image"

   7:     "image/png"

   8:     "log"

   9:     "os"

  10: )

  11:  

  12: func main() {

  13:     src, err := LoadImage("348.png")

  14:     if err != nil {

  15:         log.Fatal(err)

  16:     }

  17:  

  18:     dst := image.NewRGBA(image.Rect(0, 0, 350, 400))

  19:  

  20:     err = graphics.Blur(dst, src, &graphics.BlurOptions{StdDev: 1.1})

  21:     if err != nil {

  22:         log.Fatal(err)

  23:     }

  24:  

  25:     // 需要保存的文件

  26:     imgcounter := 510

  27:     saveImage(fmt.Sprintf("%03d.png", imgcounter), dst)

  28: }

  29:  

  30: // LoadImage decodes an image from a file.

  31: func LoadImage(path string) (img image.Image, err error) {

  32:     file, err := os.Open(path)

  33:     if err != nil {

  34:         return

  35:     }

  36:     defer file.Close()

  37:     img, _, err = image.Decode(file)

  38:     return

  39: }

  40:  

  41: // 保存Png图片

  42: func saveImage(path string, img image.Image) (err error) {

  43:     // 需要保存的文件

  44:     imgfile, err := os.Create(path)

  45:     defer imgfile.Close()

  46:  

  47:     // 以PNG格式保存文件

  48:     err = png.Encode(imgfile, img)

  49:     if err != nil {

  50:         log.Fatal(err)

  51:     }

  52:     return

  53: }

代码说明:

模糊参数:

   1: // BlurOptions are the blurring parameters.

   2: // StdDev is the standard deviation of the normal, higher is blurrier.

   3: // StdDev 是正常的标准偏差, 值越大越虚化

   4: // Size is the size of the kernel. If zero, it is set to Ceil(6 * StdDev).

   5: // 

   6: type BlurOptions struct {

   7:     StdDev float64

   8:     Size   int

   9: }

缩略图

原始图:

确保数据完整的缩放,效果如下:

相关代码:

   1: package main

   2:  

   3: import (

   4:     "code.google.com/p/graphics-go/graphics"

   5:     "fmt"

   6:     "image"

   7:     "image/png"

   8:     "log"

   9:     "os"

  10: )

  11:  

  12: func main() {

  13:     src, err := LoadImage("348.png")

  14:     if err != nil {

  15:         log.Fatal(err)

  16:     }

  17:  

  18:     // 缩略图的大小

  19:     dst := image.NewRGBA(image.Rect(0, 0, 20, 80))

  20:  

  21:     // 产生缩略图,等比例缩放

  22:     err = graphics.Scale(dst, src)

  23:     if err != nil {

  24:         log.Fatal(err)

  25:     }

  26:  

  27:     // 需要保存的文件

  28:     imgcounter := 734

  29:     saveImage(fmt.Sprintf("%03d.png", imgcounter), dst)

  30: }

  31:  

  32: // LoadImage decodes an image from a file.

  33: func LoadImage(path string) (img image.Image, err error) {

  34:     file, err := os.Open(path)

  35:     if err != nil {

  36:         return

  37:     }

  38:     defer file.Close()

  39:     img, _, err = image.Decode(file)

  40:     return

  41: }

  42:  

  43: // 保存Png图片

  44: func saveImage(path string, img image.Image) (err error) {

  45:     // 需要保存的文件

  46:     imgfile, err := os.Create(path)

  47:     defer imgfile.Close()

  48:  

  49:     // 以PNG格式保存文件

  50:     err = png.Encode(imgfile, img)

  51:     if err != nil {

  52:         log.Fatal(err)

  53:     }

  54:     return

  55: }

图片数据可以丢弃的缩放效果:

 

相关代码:

   1: package main

   2:  

   3: import (

   4:     "code.google.com/p/graphics-go/graphics"

   5:     "fmt"

   6:     "image"

   7:     "image/png"

   8:     "log"

   9:     "os"

  10: )

  11:  

  12: func main() {

  13:     src, err := LoadImage("348.png")

  14:     if err != nil {

  15:         log.Fatal(err)

  16:     }

  17:  

  18:     // 缩略图的大小

  19:     dst := image.NewRGBA(image.Rect(0, 0, 20, 80))

  20:  

  21:     // 产生缩略图

  22:     err = graphics.Thumbnail(dst, src)

  23:     if err != nil {

  24:         log.Fatal(err)

  25:     }

  26:  

  27:     // 需要保存的文件

  28:     imgcounter := 670

  29:     saveImage(fmt.Sprintf("%03d.png", imgcounter), dst)

  30: }

  31:  

  32: // LoadImage decodes an image from a file.

  33: func LoadImage(path string) (img image.Image, err error) {

  34:     file, err := os.Open(path)

  35:     if err != nil {

  36:         return

  37:     }

  38:     defer file.Close()

  39:     img, _, err = image.Decode(file)

  40:     return

  41: }

  42:  

  43: // 保存Png图片

  44: func saveImage(path string, img image.Image) (err error) {

  45:     // 需要保存的文件

  46:     imgfile, err := os.Create(path)

  47:     defer imgfile.Close()

  48:  

  49:     // 以PNG格式保存文件

  50:     err = png.Encode(imgfile, img)

  51:     if err != nil {

  52:         log.Fatal(err)

  53:     }

  54:     return

  55: }

 

更多相关资料请看下面地址:

https://code.google.com/p/graphics-go/source/browse/graphics/?r=9a6eb915f43de825cd2a26c8b8866422d0a3f2ec

Golang官方图片库的更多相关文章

  1. Golang官方log包详解

    Golang官方log包详解 以下全是代码, 详解在注释中, 请从头到尾看 // Copyright 2009 The Go Authors. All rights reserved. // Use ...

  2. golang官方实现如何对httpserver做频率限制(最大连接数限制)

    一般海量处理服务,都会对服务做个最大连接数限制,超过该限制之后,拒绝服务,避免发生雪崩,压坏服务. 使用golang来编写httpserver时,如何进行呢?官方已经有实现好的包. 使用示例: imp ...

  3. 【GoLang】GoLang 官方 对 error 处理的意见

    The Go Blog Errors are values 12 January 2015 A common point of discussion among Go programmers, esp ...

  4. golang官方嵌入文件到可执行程序

    目录 前言 示例程序 嵌入文件直接访问 嵌入文件列表 总结 前言 在go官方出嵌入文件的方法前我在网上找过,并且自己还研究过,虽然没有问题,但是既然官方支持还是用起来吧. 看了下go源码embed/e ...

  5. 【GoLang】GoLang 错误处理 -- 官方推荐方式 示例

    最严谨的方式,Always检查error,并做相应的处理 项目结构: 代码: common.go: package common import ( "github.com/pkg/error ...

  6. 【GoLang】转载:我为什么放弃Go语言,哈哈

    我为什么放弃Go语言 作者:庄晓立(Liigo) 日期:2014年3月 原创链接:http://blog.csdn.NET/liigo/article/details/23699459 转载请注明出处 ...

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

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

  8. golang(5):编写WebSocket服务,client和html5调用

    本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46882777 转载请必须注明出处! 1.关于websocket HTML5定义了 ...

  9. 组织Golang代码

    本月初golang官方blog(需要自己搭梯子)上发布了一篇文章,简要介绍了近几个月Go在一 些技术会议上(比如Google I/O.Gopher SummerFest等)的主题分享并伴有slide链 ...

随机推荐

  1. 通过表达式、函数给React组件属性赋值

    一.需求 当有传属性name的值时,则显示Hello "name",否则显示Hello World 二.4种方式的代码实现 1.通过三元运算符 <!DOCTYPE html& ...

  2. Android UI 之 Tab类型界面总结

    Android 程序中实现Tab类型界面很常见,本人在做项目的时候也经常用到,所以想在这里总结一下,实现tab类型界面的几种方式,供大家参考.如有不对之处,欢迎大家指正! 一.TabActivity ...

  3. 15个必须知道的chrome开发者技巧

    在Web开发者中,Google Chrome是使用最广泛的浏览器.六周一次的发布周期和一套强大的不断扩大开发功能,使其成为了web开发者必备的工具.你可能已经熟悉了它的部分功能,如使用console和 ...

  4. spry菜单栏(一)

    spry菜单栏使用教程 关于 Spry 框架 Spry 框架是一个 JavaScript 库,Web 设计人员使用它可以构建能够向站点访问者提供更丰富体验的 Web 页.有了 Spry,就可以使用 H ...

  5. pyhton与json,Xml

    对简单数据类型的encoding 和 decoding: 使用简单的json.dumps方法对简单数据类型进行编码,例如: 1 2 3 4 5 6 import json   obj = [[1,2, ...

  6. Java 基础-反射

    反射-Reflect 测试用到的代码 1.接口 Person.java public interface Person { Boolean isMale = true; void say(); voi ...

  7. cdoj 1329 卿学姐与魔法 优先队列

    卿学姐与魔法 Time Limit: 1200/800MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  8. 编译Apache Hadoop2.2.0源代码

    Hadoop2的学习资料很少,只有官网的少数文档.如果想更深入的研究hadoop2,除了仅看官网的文档外,还要学习如何看源码,通过不断的调试跟踪源码,学习hadoop的运行机制. 1.安装CentOS ...

  9. spring 定时器设置每隔10秒触发

    <property name="cronExpression" value="0/10 * * * * ?" />

  10. 【笨嘴拙舌WINDOWS】GDI映射方式

    TextOut(hdc,100,100,TEXT(“Love China”),10) 这句GDI函数的作用是在坐标点(100,100)的位置输出一个“Love China”字符串: GDI函数作为硬件 ...