【Golang画图】2D渲染绘图库gg的概念与用法详解(一)

概述

最近的项目中需要用代码来手工绘图,例如设置背景图片、贴矩形、贴文字至指定位置等等,但是标准库中的image包又有些偏向底层了,于是想找一个go语言中可用性较高的2D渲染绘图封装库,寻找了一番,个人感觉最合适的便是fogleman/gg了:官方文档

理解了gg包的一些基本概念之后,它还是很便于绘制2D图像的,预置了不少类似但不限于画圆、画方、画线、填充、描边、旋转、缩放、文字处理、剪切、蒙版、翻转的接口,那么,开始吧。

基本使用

如下代码:

package main

import "github.com/fogleman/gg"

func main() {
    
	dc := gg.NewContext(512, 512)
	dc.SetRGB255(255,222,173)
	dc.Clear()
	dc.SavePNG("out.png")
}

执行后,你便得到了一张黄图(纯黄色的图

解析

第一行,使用gg.NewContext创建了一个大小为512x512的画布dc。

第二行,通过dc.SetRGB255将当前画笔颜色设置为RGB 255,222,173,即黄色。

第三行,Clear方法将会使用当前画笔颜色填充满整个画布。

第四行,将画布保存成PNG格式图片。

基本概念

要想理解gg包的用法,首先要掌握一组基本概念,但此类内容网上又找不到任何参考资料,因此下述内容皆为我(RicheyJang)的个人理解,欢迎交流指正!

gg包的概念继承并改造于官方的freetype包,仅对于使用gg包来说,需要了解以下概念:

画布(Context):直译过来以及对于golang标准概念而言,它应该被成为上下文,但是为了便于理解,我称之为画布,是一张定义中、描绘中的图片。

路径(path):路径是一组子路径。

子路径(subpath):子路径是一个起点,加一组首尾相连的线性、二次或三次贝塞尔曲线(不一定闭合)。

当前路径(current path):当前正在定义(不一定已经真正画到画布上)的路径。

当前点(current point):画布上的一个点(像素点),标志了当前画笔所在的位置。也就是当前子路径的尾点。

基本底层操作

首先是直接针对路径的操作:

dc := gg.NewContext(w, h) // 创建宽为w、长为h的新画布。

dc.Fill() 
// Fill 将会使用当前画笔颜色填充满当前路径所闭合出的区域(当前路径中的各个子路径会被gg隐式闭合)。
dc.FillPreserve() 
// FillPreserve 将会使用当前画笔颜色填充满当前路径所闭合出的区域(当前路径中的各个子路径会被gg隐式闭合)。
// 它与Fill方法的区别是,Fill将会一并删除当前路径,而FillPreserve不会。
dc.Stroke() 
// Stroke 将会把当前路径使用当前画笔颜色描绘到画布上。
dc.StrokePreserve() 
// StrokePreserve 它与Stroke方法的区别类比上述Fill与FillPreserve。

上述几个方法为非常常用的绘图方法,下面便是一些更偏底层的用于绘制路径本身的方法了。

dc.NewSubPath()
// NewSubPath 会在当前路径中新建一条子路径,会使得"当前点"不存在。
dc.ClearPath()
// ClearPath 将会清除当前路径。
dc.ClosePath()
// ClosePath 会添加一条起点为当前点、终点为当前子路径起点线性线段。用于显式地闭合当前子路径。
dc.MoveTo(x, y)
// MoveTo 会新建一条起点为(x,y)的子路径,并将当前点设为(x,y)。
dc.LineTo(x, y)
// LineTo 会向当前子路径添加一条起点为当前点、终点为(x,y)的线性线段,并将当前点设为(x,y)。若当前点不存在,它等同于MoveTo(x,y)。

不过,不会真有人直接只用上述路径操作来画图吧,那也太麻烦了(;´д`)ゞ。

gg包封装了一组以Draw打头的方法,用于便携地画出圆形、矩形、图像、文字等等路径或者贴图,不过此类内容,干说不如实操,请参阅后述具体操作章节。

接下来是一组针对画笔的操作:

dc.SetLineWidth(lineWidth)
// SetLineWidth 设置画笔宽度为lineWidth,会在Stroke时体现出来。
dc.SetFontFace(fontFace)
// SetFontFace 设置画笔字体为fontFace,fontFace为font.Face类型。
// 也可以使用LoadFontFace(path string, points float64)方法从本地路径加载字体文件。
dc.SetColor(c)
// SetColor 设置当前画笔颜色为c,c为color.Color类型。

关于设置画笔颜色,还有一系列封装方法,例如:(省略了dc.)

SetHexColor(x 
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值