imagepipeline

package module
v0.0.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 1, 2022 License: Apache-2.0 Imports: 30 Imported by: 1

README

image-pipeline

image-pipeline提供一系列的图片处理功能,如格式转换、缩放、水印添加等,可以通过pipeline的形式串连。提供的功能如下:

  • 根据可接受的图片格式自动选择匹配格式,优先为avif,其次webp
  • 根据指定转换格式与质量压缩图片
  • 将图片的宽高调整为适合指定的宽高
  • 将图片的宽高调整为填满指定的宽高
  • 将水印以添加至图片上

图片拉取

image-pipeline不提供图片的存储功能,其支持以下几类的图片拉取方式:

  • HTTP
  • 文件目录
  • minio
  • mongodb的gridfs
  • 阿里云oss
HTTP

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")
File

文件的形式较为简单,只需要指定目录即可,生产环境不建议使用此方式,因为pu如果要使用则建议使用NFS等形式挂载网络存储。

func AddFileFinder(name, basePath string) error 
  • name: 文件Finder的名称,必须唯一
  • basePath: 文件路径,finder提供的图片拉取均为此目录下
imagepipeline.AddFileFinder("myImages", "/opt/images")
Minio

minio是一款开源的对象存储服务器,兼容亚马逊的S3协议,初始化其finder需要指定连接串。

func AddMinioFinder(name, uri string) error 
  • name: Minio Finder的名称,必须唯一
  • uri: 连接串,格式如下:minio://ip:port/?accessKey=key&secretKey=secret,其中minio://并不影响,以http://的形式一样可行。accessKeysecretKey则根据minio的配置填写即可
imagepipeline.AddMinioFinder("myMinioImages", "minio://192.168.1.5:900/?accessKey=key&secretKey=secret")
Gridfs

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")
Aliyun OSS

阿里云的对象存储服务可以方便快捷的存储各类图片。

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")

Pipeline

初始化各类Finder之后,即可以pipeline的形式拼接各类的任务(多个任务以|连接,任务参数以/分隔),假设所有类型的finder均有初始化(其名称为类型Finder,如httpFinder)。pipeline在处理任务时,优先按照匹配固定规则,如果都不匹配则以finder的形式来处理。

固定的任务类型如下:proxyoptimizeautoOptimizefitResizefillResizeoptimizeautoOptimize图片压缩转换一般都是作为处理任务。

需要注意,pipeline的任务第一个必须是获取图片数据的,下面是各类任务的描述:

Proxy

proxy/https%3A%2F%2Fwww.baidu.com%2Fimg%2FPCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png,任务描述以proxy开头,表示以HTTP形式获取后面URL中的图片

Optimize

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

autoOptimize/192.168.1.1:6002/80,任务描述以autoOptimize开头,前三个参数与optimize一致。此任务会根据客户端可接受的图片类型选择最优的图片:avif -> webp -> 原类型

FitResize

fitResize/500/600,任务描述以fitResize开头,后面两个参数为宽、高,此任务会根据指定的宽高调整图片大小

FillResize

fillResize/500/600,任务描述以fillResize开头,参数与fitResize,只是调整宽高的处理方式不同

HTTP Finder

httpFinder/image%2Fbanner.png,此处假设初始化了一个名为httpFinder的http finder。对于http finder,后面的参数则是对应的图片地址,通过此地址获取对应的图片

File Finder

fileFinder/image%2Fbanner.png,此处假设初始化了一个名为fileFinder的file finder。对于file finder ,后面的参数则是对应图片的相对地址,通过此地址读取图片

Minio Finder

minioFinder/bucketName/objectName,此处假设初始化了一个名为minioFinder的minio finder。对于minio finder,后面的参数对应其bucket与object的名称,通过这两个参数指定图片存储位置

GridFS Finder

gridfsFinder/objectID/collection,此处假设初始化了一个名为gridfsFinder的grfidfs finder。对于gridfs finder,第一个参数为图片的objectID,第二个参数为对应的collection(可选,若无此参数则为fs),读取对应的Object数据

Aliyun Oss Finder

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)

Documentation

Index

Constants

View Source
const (
	PositionTopLeft     = "topLeft"
	PositionTop         = "top"
	PositionTopRight    = "topRight"
	PositionLeft        = "left"
	PositionCenter      = "center"
	PositionRight       = "right"
	PositionBottomLeft  = "bottomLeft"
	PositionBottom      = "bottom"
	PositionBottomRight = "bottomRight"
)
View Source
const (
	ImageTypePNG  = "png"
	ImageTypeJPEG = "jpeg"
	ImageTypeWEBP = "webp"
	ImageTypeAVIF = "avif"
)
View Source
const (
	TaskProxy        = "proxy"
	TaskOptimize     = "optimize"
	TaskAutoOptimize = "autoOptimize"
	TaskFitResize    = "fitResize"
	TaskFillResize   = "fillResize"
	TaskWatermark    = "watermark"
)

Variables

View Source
var ErrAbortNext = errors.New("abort next")

不再执行后续时返回

View Source
var ErrFinderInValid = errors.New("Finder is invald")
View Source
var ErrFinderNotFound = errors.New("Finder is not found")
View Source
var ErrGRPCClientInvalid = errors.New("grpc client connection is invalid")

Functions

func AddAliyunOSSFinder

func AddAliyunOSSFinder(name, uri string) error

AddAliyunOSSFinder add aliyun oss finder

func AddFileFinder

func AddFileFinder(name, basePath string) error

AddFileFinder adds a file finder

func AddFinder added in v0.0.4

func AddFinder(name, uri string) error

func AddGridFSFinder

func AddGridFSFinder(name, uri string) error

AddGridFSFinder adds mongodb gridfs finder

func AddHTTPFinder

func AddHTTPFinder(name, uri string, onStatus ...upstream.StatusListener) error

AddHTTPFinder adds a http finder

func AddMinioFinder

func AddMinioFinder(name, uri string) error

AddMinioFinder adds a minio finder

func RangeFinder

func RangeFinder(fn func(name string, f Finder))

RangeFinder calls fn sequentially for each key and find in the finders

func TaskAlias added in v0.0.2

func TaskAlias(alias, name string)

Types

type Finder

type Finder interface {
	Find(ctx context.Context, params ...string) (*Image, error)
	Close(ctx context.Context) error
}

func GetFinder

func GetFinder(name string) (Finder, error)

GetFinder returns a finder by name

type Image

type Image struct {
	// contains filtered or unexported fields
}

func Do

func Do(ctx context.Context, img *Image, jobs ...Job) (*Image, error)

Do runs the pipeline jobs

func FetchImageFromURL

func FetchImageFromURL(ctx context.Context, url string) (*Image, error)

FetchImageFromURL fetch image from http url

func NewImageFromBytes

func NewImageFromBytes(data []byte) (*Image, error)

NewImageFromBytes returns a image from byte data, an error will be return if decode fail

func (*Image) Bytes added in v0.0.2

func (i *Image) Bytes() ([]byte, string)

Bytes returns the bytes and format of image

func (*Image) Height

func (i *Image) Height() int

Height returns the height of image

func (*Image) JPEG

func (i *Image) JPEG() ([]byte, error)

JPEG encodes the image as jpeg, and returns the bytes

func (*Image) PNG

func (i *Image) PNG() ([]byte, error)

PNG encodes the image as png, and returns the bytes

func (*Image) Previous

func (i *Image) Previous() *Image

Previous returns the previous image

func (*Image) Set

func (i *Image) Set(grid image.Image)

Set sets the image grid

func (*Image) Width

func (i *Image) Width() int

Width returns the width of image

type ImageFinder

type ImageFinder func(ctx context.Context, params ...string) (*Image, error)

type Job

type Job func(context.Context, *Image) (*Image, error)

Job is the image pipeline job

func NewAutoOptimizeImage

func NewAutoOptimizeImage(addr string, quality int, accept string) Job

NewAutoOptimizeImage creates an optimize image job, which will find the match type for optimizing by accept

func NewFillResizeImage

func NewFillResizeImage(width, height int) Job

NewFillResizeImage creates an image job, which will resize the image to fill with/height

func NewFitResizeImage

func NewFitResizeImage(width, height int) Job

NewFitResizeImage creates an image job, which will resize the image to fit width/height

func NewOptimizeImage

func NewOptimizeImage(addr string, quality int, formats ...string) Job

NewOptimizeImage creates an optimize image job, it the format is nil, the original format will be used

func NewWatermark

func NewWatermark(watermarkImg image.Image, position string, angle float64) Job

NewWatermark creates an image job, which will add watermark to image

func Parse

func Parse(taskPipeLine, accept string) ([]Job, error)

Parse parses the task pipe line to job list

type Parser

type Parser func(params []string, accept string) (Job, error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL