Golang有一个很有意思的官方库,叫golang.org/x,x可能是extends,experimental,总之是一些在官方库中没有,但是又很有用的库。最近花点时间把这里有用的介绍一下。
- Image库
提供更多的图像格式
golang.org/x/image库整体结构如图
除了colornames,math,vector等基础库之外,最重要的一块功能是提供了更多的图像格式编解码功能,包括bmp、ccitt、tiff、vp8、vp8l、webp,我们知道官方库中只支持jpeg、png、gif,通过这些库的引入,可以扩展支持更多的图像格式,但其中只有bmp、tiff支持编码,也就是写入文件,其他几种格式仅提供了解码功能。
同时,调用image.RegisterFormat注册成为可解码库的只有bmp, tiff和webp
也就是说,只有以上三种可以通过匿名import,然后通过调用image.Decode进行类型探测并解码成功。
具体可能是因为单帧/多帧等应用场景的区别,具体的暂时没有研究。
替代原有的Resize等第三方库
原来我们如果要做头像的上传等功能的时候,一般都要用到图像的大小变化resize功能,起初常用的库是
https://github.com/nfnt/resize
这个库搜索量很大,一搜就能出来,但是今年11月已经被作者封存了。
替代的选择就是x库中的
golang.org/x/image/draw
Draw库resize使用上的区别
除了具体函数入参有部分区别之外,和原有常用库区别不大。
插值方法
原nfnt/resize库:
NearestNeighbor
: Nearest-neighbor interpolationBilinear
: Bilinear interpolationBicubic
: Bicubic interpolationMitchellNetravali
: Mitchell-Netravali interpolationLanczos2
: Lanczos resampling with a=2Lanczos3
: Lanczos resampling with a=3
draw库
-
NearestNeighbor
-
ApproxBiLinear
-
BiLinear
-
CatmullRom
可见官方库在算法选择度上还是差些,幸好,插值算法就是如果你要把图像扩大,那么大图像和小图像之间缺失的部分怎么自动填充的问题,如果仅仅是头像等缩略图的需求,区别不是很大,我们常用的就是NearestNeighbor。
文字绘图时常用的font库
image下还有font库,通常用于在图像上绘制文字的应用场景。
绘制文字需要知道字体,配置大小、是否粗体等信息,font下还有opentype库用于从truetype和opentype的字体描述文件中获得字体信息,但freetype并不包含在x/image/font中,freetype的支持在GitHub - golang/freetype: The Freetype font rasterizer in the Go programming language.
但freetype也是配合x/image/font的。
下周介绍跟文字相关的text库