Golang 绘图技术(image/draw包介绍)
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的方法。
它的参数描述如下:
- dst 绘图的背景图。
- r 是背景图的绘图区域
- src 是要绘制的图
- sp 是 src 对应的绘图开始点(绘制的大小 r变量定义了)
- mask 是绘图时用的蒙版,控制替换图片的方式。
- mp 是绘图时蒙版开始点(绘制的大小 r变量定义了)
- op Op is a Porter-Duff compositing operator. 参考文章:http://blog.csdn.net/ison81/article/details/5468763
Porter-Duff 等式12种规则可以看这篇博客:http://www.blogjava.net/onedaylover/archive/2008/01/16/175675.html
下图就是几个相关的例子:
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包介绍)的更多相关文章
- Windows 窗体的.Net 框架绘图技术
当编写一个典型的Windows 窗体程序时,窗体和控件的绘制.效果等操作是不需要特别加以考虑的.这是为什么呢?因为通过使用 .Net 框架,开发人员可以拖动一系列的控件到窗体上,并书写一些简单的与事件 ...
- PHP自学之路---报表及绘图技术
Ø 报表 a) 什么是报表 报表就是用表格.图表等格式来动态显示数据. b) PHP绘图坐标系 1. 坐标系介绍 下图说明了PHP坐标系.坐标原点位于左上角,以像素为单 ...
- Unity 绘图性能优化 - Draw Call Batching
Unity 绘图性能优化 - Draw Call Batching Unity官方链接:http://docs.unity3d.com/Manual/DrawCallBatching.html 转载请 ...
- 【MFC】MFC绘制动态曲线,用双缓冲绘图技术防闪烁
摘自:http://zhy1987819.blog.163.com/blog/static/841427882011614103454335/ MFC绘制动态曲线,用双缓冲绘图技术防闪烁 2011 ...
- 【转 | 侵删】2D 绘图技术中的坐标系统与坐标变换
本文介绍在 2D 绘图技术中的坐标系统和坐标变换的相关知识.同时介绍 Kity 在这方面提供的 API .希望这些知识对于需要进行图形应用开发的同学会有所帮助. 锤子的故事 很久以前,有一个画家,他很 ...
- golang学习笔记 ---常用第三方包
包的介绍 包类似Java中概念,jar是源代码管理,分发的最小单位. 目前多数包来自 Github官方包来自 golang.org/x/... 可以在如下网址查询到高频使用的第三方包清单https:/ ...
- Lucene.net站内搜索—4、搜索引擎第一版技术储备(简单介绍Log4Net、生产者消费者模式)
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- 【PHP绘图技术&&验证码绘制】
PHP绘图是比较简单的事情,基本绘图如直线.圆.矩形.弧线.填充矩形.填充扇形.非中文字的打印.中文文字的打印在在下面的代码中会纤细讲解. 需要支持中文的字体,可以到windows自带的字体库中找,并 ...
- ar技术序章-SDK介绍和选择
转自: http://blog.csdn.net/kun1234567/article/details/10402535 ar技术序章-SDK介绍和选择 分类: Augmented Reality20 ...
随机推荐
- 通过表达式、函数给React组件属性赋值
一.需求 当有传属性name的值时,则显示Hello "name",否则显示Hello World 二.4种方式的代码实现 1.通过三元运算符 <!DOCTYPE html& ...
- 将IDEA快捷键改为Eclipse模式
windows下选择File-->Settings,搜索Keymaps,右栏选择Eclipse
- MAC的一些实用
重置Dock, Launchpad defaults write com.apple.dock ResetLaunchPad -bool true; killall Dock;
- Mysql日期和时间函数不求人
这里是一个使用日期函数的例子.下面的查询选择了所有记录,其date_col的值是在最后30天以内: mysql> SELECT something FROM table WHERE TO_DA ...
- Matlab绘图高级部分
图形是呈现数据的一种直观方式,在用Matlab进行数据处理和计算后,我们一般都会以图形的形式将结果呈现出来.尤其在论文的撰写中,优雅的图形无疑会为文章加分.本篇文章非完全原创,我的工作就是把见到的Ma ...
- Android判断网络是否已经连接
// check all network connect, WIFI or mobile public static boolean isNetworkAvailable(final Context ...
- The GPG keys listed not correct
The GPG keys listed for the "Extra Packages for Enterprise Linux 5 - x86_64" repository ar ...
- leetcode:Delete Node in a Linked List
Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...
- 我的ipad应用备份
听歌: 网易云音乐,QQ音乐 摄影: CameraConnect,Replay,PhotoBooth,PhotoCollage,画中画相机,Creative Shape, 简拼,玩图,PicsArt, ...
- 【笨嘴拙舌WINDOWS】SetCapture和ReleaseCapture
光电鼠标器是通过红外线或激光检测鼠标器的位移,将位移信号转换为电脉冲信号,再通过程序的处理和转换来控制屏幕上的光标箭头的移动的一种硬件设备. 换句话说,鼠标无时无刻不在监视着人类的活动,当人类用意识去 ...