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. WPF之RichTextBox丢失光标仍然选中文本

    描述:开发中完成了一个类似于Word的悬浮工具栏功能,选中文本之后可以自动弹出一个工具栏.可以修改字体.字体大小等功能,问题来了,我发现当去进行操作的时候原本选中的RichTextBox的内容的颜色会 ...

  2. Android 怎样把光标放在EditText中文本的末尾处?

    EditText et = (EditText)findViewById(R.id.inbox); et.setSelection(et.getText().length());

  3. Awstats分析Nginx日志

    1.nginx日志格式设定 log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$ ...

  4. R语言学习笔记——Base Graphics

    做exploratory data annalysis的作业,差点被虐死了,R从头开始,边做边学,最后搞到一点多才弄完,还有一个图怎么画都不对,最后发现是数据读取的时候有问题. 用来画图的数据来自:h ...

  5. redis 2.4异常

    最近公司redis服务出现了异常,记录下教训: redis异常后:观察redis服务,可以看到redis cpu占用100% 用strace命令查看redis进程,显示如下: open("/ ...

  6. VC操作ADO的基本策略

    一.ADO概述 ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口.ADO 使您能够编写应用程序以通过 OLE. DB 提供者访问和操作数据 ...

  7. [HDOJ5584]LCM Walk(数论,规律)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5584 给一个坐标(ex, ey),问是由哪几个点走过来的.走的规则是x或者y加上他们的最小公倍数lcm ...

  8. 上海二手房8月排名:链家、悟空找房、中原、太平洋、我爱我家、易居、房天下、iwjw、房多多、房好多、q房网、、、

    房产网站总结 链家: 悟空找房: 中原: 太平洋: 我爱我家: 易居: 房天下: iwjw:有较多二手房信息 链家称王 房多多领跑电商平台 近日,云房数据公布了8月上海房产中介成交数据,从排行榜来看, ...

  9. android漂亮的对话框项目sweet-alert-dialog

      漂亮的对话框 sweet-alert-dialog 项目地址: https://github.com/pedant/sweet-alert-dialog android原生的dialog太生硬了, ...

  10. UVa 839 (递归方式读取二叉树) Not so Mobile

    题意: 递归的方式输入一个树状天平(一个天平下面挂的不一定是砝码还可能是一个子天平),判断这个天平是否能满足平衡条件,即W1 * D1 == W2 * D2. 递归的方式处理输入数据感觉很巧妙,我虽然 ...