image/draw 包仅仅定义了一个操作:通过可选的蒙版图(mask image),把一个原始图片绘制到目标图片上,这个操作是出奇的灵活,可以优雅和高效的执行很多常见的图像处理任务。

   1: // Draw calls DrawMask with a nil mask.

   2: func Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point, op Op)

   3: func DrawMask(dst Image, r image.Rectangle, src image.Image, sp image.Point,

   4:     mask image.Image, mp image.Point, op Op)

第一个函数Draw是没有使用蒙版mask的调用方法,它内部其实就是调用的mask为 nil的方法。

它的参数描述如下:

 

 

下图就是几个相关的例子:

mask 蒙版是渐变

给一个矩形填充颜色

使用 Draw方法的逻辑效果图:

代码:

   1: m := image.NewRGBA(image.Rect(0, 0, 640, 480))

   2: blue := color.RGBA{0, 0, 255, 255}

   3: draw.Draw(m, m.Bounds(), &image.Uniform{blue}, image.ZP, draw.Src)

拷贝图片的一部分

效果特效如下:

相关代码:

   1: r := image.Rectangle{dp, dp.Add(sr.Size())}  // 获得更换区域

   2: draw.Draw(dst, r, src, sr.Min, draw.Src)

如果是复制整个图片,则更简单:

   1: sr = src.Bounds()         // 获取要复制图片的尺寸

   2: r := sr.Sub(sr.Min).Add(dp)   // 目标图的要剪切区域

   3: draw.Draw(dst, r, src, sr.Min, draw.Src)

图片滚动效果

效果如下图:

假设我们需要把图片 m 上移20个像素.

相关代码:

   1: b := m.Bounds()

   2: p := image.Pt(0, 20)

   3: // Note that even though the second argument is b,

   4: // the effective rectangle is smaller due to clipping.

   5: draw.Draw(m, b, m, b.Min.Add(p), draw.Src)

   6: dirtyRect := b.Intersect(image.Rect(b.Min.X, b.Max.Y-20, b.Max.X, b.Max.Y))

把一个图片转成RGBA格式

效果图:

相关代码:

   1: b := src.Bounds()

   2: m := image.NewRGBA(b)

   3: draw.Draw(m, b, src, b.Min, draw.Src)

通过蒙版画特效

效果图

相关代码

   1: type circle struct {

   2:     p image.Point

   3:     r int

   4: }

   5:  

   6: func (c *circle) ColorModel() color.Model {

   7:     return color.AlphaModel

   8: }

   9:  

  10: func (c *circle) Bounds() image.Rectangle {

  11:     return image.Rect(c.p.X-c.r, c.p.Y-c.r, c.p.X+c.r, c.p.Y+c.r)

  12: }

  13:  

  14: func (c *circle) At(x, y int) color.Color {

  15:     xx, yy, rr := float64(x-c.p.X)+0.5, float64(y-c.p.Y)+0.5, float64(c.r)

  16:     if xx*xx+yy*yy < rr*rr {

  17:         return color.Alpha{255}

  18:     }

  19:     return color.Alpha{0}

  20: }

  21:  

  22:  

  23: draw.DrawMask(dst, dst.Bounds(), src, image.ZP, &circle{p, r}, image.ZP, draw.Over)

注意,一个image对象只需要实现下面几个就可,这也就是Go接口强大的地方.

   1: type Image interface {

   2:     // ColorModel returns the Image's color model.

   3:     ColorModel() color.Model

   4:     // Bounds returns the domain for which At can return non-zero color.

   5:     // The bounds do not necessarily contain the point (0, 0).

   6:     Bounds() Rectangle

   7:     // At returns the color of the pixel at (x, y).

   8:     // At(Bounds().Min.X, Bounds().Min.Y) returns the upper-left pixel of the grid.

   9:     // At(Bounds().Max.X-1, Bounds().Max.Y-1) returns the lower-right one.

  10:     At(x, y int) color.Color

  11: }

画一个字体

效果图,画一个蓝色背景的字体。

相关伪代码:

   1: src := &image.Uniform{color.RGBA{0, 0, 255, 255}}

   2: mask := theGlyphImageForAFont()

   3: mr := theBoundsFor(glyphIndex)

   4: draw.DrawMask(dst, mr.Sub(mr.Min).Add(p), src, image.ZP, mask, mr.Min, draw.Over)

 

上面例子完整的代码请看:

http://golang.org/doc/progs/image_draw.go

 

参考:

 http://blog.golang.org/go-imagedraw-package

Golang 绘图技术(image/draw包介绍)的更多相关文章

  1. Windows 窗体的.Net 框架绘图技术

    当编写一个典型的Windows 窗体程序时,窗体和控件的绘制.效果等操作是不需要特别加以考虑的.这是为什么呢?因为通过使用 .Net 框架,开发人员可以拖动一系列的控件到窗体上,并书写一些简单的与事件 ...

  2. PHP自学之路---报表及绘图技术

    Ø  报表 a)        什么是报表 报表就是用表格.图表等格式来动态显示数据. b)        PHP绘图坐标系 1.  坐标系介绍 下图说明了PHP坐标系.坐标原点位于左上角,以像素为单 ...

  3. Unity 绘图性能优化 - Draw Call Batching

    Unity 绘图性能优化 - Draw Call Batching Unity官方链接:http://docs.unity3d.com/Manual/DrawCallBatching.html 转载请 ...

  4. 【MFC】MFC绘制动态曲线,用双缓冲绘图技术防闪烁

    摘自:http://zhy1987819.blog.163.com/blog/static/841427882011614103454335/ MFC绘制动态曲线,用双缓冲绘图技术防闪烁   2011 ...

  5. 【转 | 侵删】2D 绘图技术中的坐标系统与坐标变换

    本文介绍在 2D 绘图技术中的坐标系统和坐标变换的相关知识.同时介绍 Kity 在这方面提供的 API .希望这些知识对于需要进行图形应用开发的同学会有所帮助. 锤子的故事 很久以前,有一个画家,他很 ...

  6. golang学习笔记 ---常用第三方包

    包的介绍 包类似Java中概念,jar是源代码管理,分发的最小单位. 目前多数包来自 Github官方包来自 golang.org/x/... 可以在如下网址查询到高频使用的第三方包清单https:/ ...

  7. Lucene.net站内搜索—4、搜索引擎第一版技术储备(简单介绍Log4Net、生产者消费者模式)

    目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...

  8. 【PHP绘图技术&&验证码绘制】

    PHP绘图是比较简单的事情,基本绘图如直线.圆.矩形.弧线.填充矩形.填充扇形.非中文字的打印.中文文字的打印在在下面的代码中会纤细讲解. 需要支持中文的字体,可以到windows自带的字体库中找,并 ...

  9. ar技术序章-SDK介绍和选择

    转自: http://blog.csdn.net/kun1234567/article/details/10402535 ar技术序章-SDK介绍和选择 分类: Augmented Reality20 ...

随机推荐

  1. sftp的安装和使用

    http://blog.srmklive.com/2013/04/24/how-to-setup-sftp-server-ftp-over-ssh-in-ubuntu/ In my previous ...

  2. WebService另一种轻量级实现—Hessian 学习笔记

    最近和同事聊天,得知他们在使用一种叫做Hessian的WebService实现方式实现远 程方法调用,是轻量级的,不依赖JavaEE容器,同时也是二进制数据格式传输,效率比SOAP的XML方式要高.感 ...

  3. The absolute uri: http://struts.apache.org/tags-bean cannot be resolved in either web.xml or the jar files deployed with this application

    在一个tomcat中部署了一个struts-1.3.10的web项目,但是没有吧struts-1.3.10的lib中的jar包放进tomcat/lib中,所以导致了这个错误(访问该项目的页面时)

  4. win8.1下解决Visual C++不兼容的方法

    1.下载visual c++的安装包 百度云下载地址为:http://pan.baidu.com/s/1c0dRAYs 2.修改MSDEV.EXE文件名 安装完成后在安装目录下找到MSDEV.EXE, ...

  5. hihoCoder 1051补提交卡(贪心 枚举)

    http://hihocoder.com/problemset/problem/1051 既然要选择最长连续提交天数,那么提交卡必须连续使用才有可能得到最优解,这样贪心,然后从头到尾扫一遍求出最大值. ...

  6. How to: Read Object Data from an XML File

    This example reads object data that was previously written to an XML file using the XmlSerializer cl ...

  7. windows 创建SSH Key

    1. 安装git,从程序目录打开 "Git Bash" (百度或用这个连接http://pan.baidu.com/s/1dDJCx9n 下载) 2. 键入命令:ssh-keyge ...

  8. shell 实例收集

    shell编程入门 http://www.runoob.com/linux/linux-shell-variable.html http://c.biancheng.net/cpp/shell/ 1. ...

  9. laravel中的命名公约规范及relation N+1问题

    User: model  ;  users: 表名: user_id 键值 relation: public function tasks(){return $this->belongsToMa ...

  10. MVC 简单发送邮件示例

    没啥好说的 直接上代码 @{ try { WebMail.SmtpServer = "smtp.qq.com";//SMTP邮件服务器 WebMail.SmtpPort = ;// ...