image-pipeline
提供一系列的图片处理功能,如格式转换、缩放、水印添加等,可以通过pipeline的形式串连。提供的功能如下:
- 根据可接受的图片格式自动选择匹配格式,优先为
avif
,其次webp
- 根据指定转换格式与质量压缩图片
- 将图片的宽高调整为适合指定的宽高
- 将图片的宽高调整为填满指定的宽高
- 将水印以添加至图片上
image-pipeline
不提供图片的存储功能,其支持以下几类的图片拉取方式:
- HTTP
- 文件目录
- minio
- mongodb的gridfs
- 阿里云oss
HTTP形式的支持多IP节点以及健康检查,配置格式:http://ip1:port1[,ip2:port2]/ping
,其中/ping
为对应HTTP服务的健康检查路径,多个ip则以,
分隔。
func AddHTTPFinder(name, uri string, onStatus ...upstream.StatusListener) error
name
: HTTP Finder的名称,其名称必须唯一,因为后续pipeline中是通过其名称来指定使用对应的finder,如果名称重复,后面添加的则会覆盖原有的uri
: 源地址,如多个节点用,
分隔onStatus
: 健康检测变化时的回调,可选
finderName := "myImageHTTPService"
imagepipeline.AddHTTPFinder(finderName, "http://192.168.1.3:8080,192.168.1.6:8080/ping")
文件的形式较为简单,只需要指定目录即可,生产环境不建议使用此方式,因为pu如果要使用则建议使用NFS等形式挂载网络存储。
func AddFileFinder(name, basePath string) error
name
: 文件Finder的名称,必须唯一basePath
: 文件路径,finder提供的图片拉取均为此目录下
imagepipeline.AddFileFinder("myImages", "/opt/images")
minio是一款开源的对象存储服务器,兼容亚马逊的S3协议,初始化其finder需要指定连接串。
func AddMinioFinder(name, uri string) error
name
: Minio Finder的名称,必须唯一uri
: 连接串,格式如下:minio://ip:port/?accessKey=key&secretKey=secret
,其中minio://
并不影响,以http://
的形式一样可行。accessKey
与secretKey
则根据minio的配置填写即可
imagepipeline.AddMinioFinder("myMinioImages", "minio://192.168.1.5:900/?accessKey=key&secretKey=secret")
gridfs是mongodb提供的文件存储,可方便的存储大量文件。
func AddGridFSFinder(name, uri string) error
name
: Mongodb Gridfs的名称,必须唯一uri
: mongodb的连接串,格式如下:mongodb://user:pwd@127.0.0.1:27017/admin
imagepipeline.AddGridFSFinder("myGridfsImages", "mongodb://user:pwd@127.0.0.1:27017/admin")
阿里云的对象存储服务可以方便快捷的存储各类图片。
func AddAliyunOSSFinder(name, uri string) error
name
: 阿里云oss的名称,必须唯一uri
: 连接串,格式如下:https://oss-cn-beijing.aliyuncs.com?accessKey=key&secretKey=secret
imagepipeline.AddAliyunOSSFinder("myOSSImages", "https://oss-cn-beijing.aliyuncs.com?accessKey=key&secretKey=secret")
初始化各类Finder之后,即可以pipeline的形式拼接各类的任务(多个任务以|连接,任务参数以/分隔),假设所有类型的finder均有初始化(其名称为类型Finder
,如httpFinder
)。pipeline在处理任务时,优先按照匹配固定规则,如果都不匹配则以finder的形式来处理。
固定的任务类型如下:proxy
、optimize
、autoOptimize
、fitResize
、fillResize
,optimize
或autoOptimize
图片压缩转换一般都是作为处理任务。
需要注意,pipeline的任务第一个必须是获取图片数据的,下面是各类任务的描述:
proxy/https%3A%2F%2Fwww.baidu.com%2Fimg%2FPCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png
,任务描述以proxy
开头,表示以HTTP形式获取后面URL中的图片
optimize/192.168.1.1:6002/80/webp
,任务描述以optimize
开头,第二个参数为tiny的服务地址,它优先以它为key获取env的参数,如为空则直接使用此参数为地址。例如如果设置了TINY_ADDR这个env的值为192.168.1.1:6002
,则上面的描述可以调整为optimize/TINY_ADDR/80/webp
。第三个参数80
表示压缩时选择的质量(可选),第四个参数webp
表示转换的图片格式(可选)
autoOptimize/192.168.1.1:6002/80
,任务描述以autoOptimize
开头,前三个参数与optimize
一致。此任务会根据客户端可接受的图片类型选择最优的图片:avif
-> webp
-> 原类型
fitResize/500/600
,任务描述以fitResize
开头,后面两个参数为宽、高,此任务会根据指定的宽高调整图片大小
fillResize/500/600
,任务描述以fillResize
开头,参数与fitResize
,只是调整宽高的处理方式不同
httpFinder/image%2Fbanner.png
,此处假设初始化了一个名为httpFinder
的http finder。对于http finder,后面的参数则是对应的图片地址,通过此地址获取对应的图片
fileFinder/image%2Fbanner.png
,此处假设初始化了一个名为fileFinder
的file finder。对于file finder ,后面的参数则是对应图片的相对地址,通过此地址读取图片
minioFinder/bucketName/objectName
,此处假设初始化了一个名为minioFinder
的minio finder。对于minio finder,后面的参数对应其bucket与object的名称,通过这两个参数指定图片存储位置
gridfsFinder/objectID/collection
,此处假设初始化了一个名为gridfsFinder
的grfidfs finder。对于gridfs finder,第一个参数为图片的objectID,第二个参数为对应的collection(可选,若无此参数则为fs),读取对应的Object数据
aliyunOSSFinder/bucketName/objectName
,此处假设初始化了个名为aliyunOSSFinder
的阿里云oss finder。它的参数与minio finder一致
使用pipeline的形式,将相关的图片处理任务串连起来,则可以实现图片的各类优化,一般的处理流程为:
1、拉取图片数据 2、对图片做缩放、水印等处理 3、对图片做压缩格式转换处理
例如下面的为将百度的图标缩小再转换为avif的处理:
// 示例代码忽略了err
jobs, _ := imagepipeline.Parse("proxy/https%3A%2F%2Fwww.baidu.com%2Fimg%2FPCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png|fitResize/100/80|optimize/192.168.1.1:6002/80/avif", "")
img, _ := imagepipeline.Do(context.Background(), nil, jobs...)
fmt.Println(img)