热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Golang绘图技术(image/draw包介绍)

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

      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 蒙版是渐变

go-imagedraw-package_20

给一个矩形填充颜色

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

image-2a

代码:

   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)
拷贝图片的一部分

效果特效如下:

image-2b

相关代码:

   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)
图片滚动效果

效果如下图:

image-2c

假设我们需要把图片 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格式

效果图:

image-2d

相关代码:

   1: b := src.Bounds()
   2: m := image.NewRGBA(b)
   3: draw.Draw(m, b, src, b.Min, draw.Src)
通过蒙版画特效

效果图

image-2e

相关代码

   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  
   
  
  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: }
画一个字体

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

image-2f

相关伪代码:

   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


推荐阅读
  • 如何与面试官愉快的交流:第一章:面试前的准备
    形象程序员的面试,不要求你着正装.但是你一定要显得干净整洁!发型两边推光,中间抹发蜡.以下图各位可以直接拿给理发师,大声说,照这个弄!图片出自:男士可以理哪些发型?切忌,不要这样! ... [详细]
  • 1Docker简介1.1什么是虚拟化在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • golang 解析磁力链为 torrent 相关的信息
    其实通过http请求已经获得了种子的信息了,但是传播存储种子好像是违法的,所以就存储些描述信息吧。之前python跑的太慢了。这个go并发不知道写的有没有问题?!packag ... [详细]
  • 本文主要分享【go协程模型】,技术文章【【GORM】模型关系-HasOne】为【VivaPython】投稿,如果你遇到GoWeb相关问题,本文相关知识或能到你。go协程模型一、概述HasO ... [详细]
  • 看到平台银行对接方案写的demo确实还不错记个笔记互相学习学习packageapiimport(cryptotlsnetnethttpstringssynct ... [详细]
  • 集成第三方库,自检测读取配置文件。文件读取,结构体定义,接口实现,错误返回,库解析,适合新同学练手。思路文件读取获取字节流文件类型分析,确定解析api集成第三方解析api管理器定义 ... [详细]
  • 使用 Go 和 ReactJS 构建聊天系统(三):设计我们的前端
    在本节中,我们将着眼于改进前端并充实该应用程序,使其看起来像一个正规的在线聊天应用程序。本节完成后的效果如下:基于组件的方法在React以及所有其他流行的前端框架中,我们倾向于将应 ... [详细]
  • Go 快速入门指南正则表达式
    概述调用regexp包即可。例子是否匹配packagemainimport(fmtregexp)funcmain(){match,err:regexp.MatchStrin ... [详细]
  • Go Mutex 源码学习
    概述互斥锁是并发程序中对共享资源进行访问控制的主要手段,Mutex是go语言提供的简单易用的互斥锁。Mutex的结构很简单,暴露的方法也只有2个,一个加锁一个解锁。那么我们每天用的 ... [详细]
  • 如果一个项目的目录齐全的话,约4320个目录。比如阶段划分上,6个阶段,下级专业划分,9个专业,再下级文档类型方面划分,约8种,再下级,建筑物分类,约10种,连乘下来就是4320个,这么多数据构造成 ... [详细]
author-avatar
创办m觉e内能h行宫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有