首页 > 其他分享 >Golang 绘图技术(image/draw包介绍)

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

时间:2023-08-10 11:32:49浏览次数:46  
标签:src draw color image Bounds Golang circle

  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.Porter-Duff 等式12种规则可以看这篇博客:http://www.blogjava.net/onedaylover/archive/2008/01/16/175675.html

 

 

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

mask 蒙版是渐变

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

给一个矩形填充颜色

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

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

代码:

 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)



拷贝图片的一部分

效果特效如下:

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

相关代码:

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)



图片滚动效果

效果如下图:

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

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

相关代码:

1: b := m.Bounds()
   1: b := src.Bounds()
   2: m := image.NewRGBA(b)
   3: draw.Draw(m, b, src, b.Min, draw.Src)

把一个图片转成RGBA格式

效果图:

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

相关代码:

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)


通过蒙版画特效

效果图

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

相关代码

1: type circle struct {
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


画一个字体

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

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

相关伪代码:

: 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

标签:src,draw,color,image,Bounds,Golang,circle
From: https://blog.51cto.com/u_15588078/7032589

相关文章

  • Kubenrtes k8s Pod镜像拉取策略与pod重启策略,imagePullPolicy restartPolicy
    Pod镜像拉取策略我们在创建pod的时候,他都需要一个镜像,他需要这个镜像的时候我们呢怎么拉取这个镜像,有个策略#下载策略有三个[root@k8s-master1~]#kubectlexplainpod.spec.containers.imagePullPolicyKIND:PodVERSION:v1FIELD:imagePullPolicy<string>#这......
  • 使用golang解决LeetCode热题Hot100(1-10)
    使用golang解决LeetCode热题Hot1001.两数之和https://leetcode.cn/problems/two-sum/题目给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个......
  • docker安装drawio绘图工具
    docker安装drawio绘图工具一、拉取镜像dockerpulljgraph/drawio二、启动容器dockerrun--name="draw"-p8080:8080-p8443:8443jgraph/drawio......
  • golang自定义 os.stderr 数据读取逻辑
    原始需求只是一个很简单的需求,使用golang的exec运行一个命令然后获取实时结果,命令是trivyimage--download-db-only正常的打印应该是2023-08-08T17:06:02.929+0800INFONeedtoupdateDB2023-08-08T17:06:02.929+0800INFODBRepository:ghcr.io/aquas......
  • golang之操作kafka
     安装第三方包:gogetgithub.com/IBM/sarama 生产者实例:packagemainimport("fmt""github.com/IBM/sarama")funcmain(){//1.生产者配置config:=sarama.NewConfig()config.Producer.RequiredAcks=sarama.WaitForAll/......
  • prometheus的sdk client_golang 使用 定时器
    之前线上监控的agent都是直接  time.Sleep(time.Duration(collectInterval)*time.Second),多少有些许的low,每次开始采集数据的时间都是从程序开始执行就开始采集,很显然这种偷懒的方式是不合理的。1、简单复制粘贴一下funcAbNormalLoglistener(collectIntervalint){......
  • golang之性能分析工具pprof
    PProf 是一个 Go 程序性能分析工具,可以分析 CPU、内存等性能。Go 在语言层面上集成了 profile 采样工具,只需在代码中简单地引入 runtime/ppro 或者 net/http/pprof 包即可获取程序的 profile 文件,并通过该文件来进行性能分析。 在 gin 中使用 pprof 功能,需要......
  • [golang]使用mTLS双向加密认证http通信
    前言假设一个场景,服务端部署在内网,客户端需要通过暴露在公网的nginx与服务端进行通信。为了避免在公网进行http明文通信造成的信息泄露,nginx与客户端之间的通信应当使用https协议,并且nginx也要验证客户端的身份,也就是mTLS双向加密认证通信。这条通信链路有三个角色:服务端、N......
  • Go / Golang JSON 一些心得
    自定义序列化和反序列化可以实现json.Marshaler和json.Unmarshaler自定义json的序列化和反序列化typeTags[]stringfunc(tTags)MarshalJSON()([]byte,error){return[]byte(strconv.Quote(strings.Join(t,","))),nil}func(t*Tags)UnmarshalJSON(b[]b......
  • golang之浮点数处理库decimal
    decimal库包是用来解决float类型对象之间运算不准确的问题的。所以,如果你想使用decimal库包,你必须先把float类型对象通过decimal.NewFromFloat()函数转成decimal.Decimal类型,然后再计算,最后还得再转成你所需要的类型。范例:packagemainimport"log"funcmain(){a:=......