golang存储与图像处理服务插件库mort的使用

Golang存储与图像处理服务插件库Mort的使用

Mort是一个用Go编写的S3兼容图像处理服务器,目前仍在积极开发中。

主要特性

  • HTTP服务器
  • 图像处理功能:调整大小、旋转、智能裁剪
  • 格式转换:支持JPEG、PNG、BMP、Webp
  • 多种存储后端:磁盘、S3、HTTP
  • 完全模块化设计
  • S3 API用于列出和上传文件
  • 请求合并
  • 内置速率限制器
  • 支持HTTP Range和条件请求
  • 压缩:gzip、brotli
  • 基于环境变量的配置
  • 可使用tengo编写自定义转换解析器
  • 支持Cloudinary图像转换和上传

示例演示

以下是Mort的一些图像处理示例:

描述 结果(点击图片查看)
预设: small (保持宽高比,宽度: 75) small
预设: blur (调整大小并模糊处理) blur
预设: webp (调整大小并转换为webp格式) webp
预设: watermark (调整大小并添加水印) watermark

安装与使用

安装

go get github.com/aldor007/mort/cmd/

命令行帮助

$ ./mort
Usage of  mort
  -config string
    	Path to configuration (default "/etc/mort/mort.yml")

配置示例

以下是一个配置示例,用于提供演示图像:

headers: # 添加或覆盖给定状态的所有响应头。此字段是可选的
  - statusCodes: [200]
    values:
      "cache-control": "max-age=84000, public"

buckets: # 可用存储桶列表
    demo:    # 存储桶名称
        keys: # S3密钥列表(可选)
          - accessKey: "access"
            secretAccessKey: "random"
        transform: # 转换配置
            path: "\/(?P<presetName>[a-z0-9_]+)\/(?P<parent>[a-z0-9\-\.]+)" # 转换路径的正则表达式
            kind: "presets-query" #  转换类型或"query"
            presets: # 预设列表
                small:
                    quality: 75
                    filters:
                        thumbnail:
                            width: 150
                blur:
                    quality: 80
                    filters:
                        thumbnail:
                            width: 700
                        blur:
                          sigma: 5.0
                webp:
                    quality: 100
                    format: webp
                    filters:
                        thumbnail:
                            width: 1000
                watermark:
                    quality: 100
                    filters:
                        thumbnail:
                            width: 1300
                        watermark:
                            image: "https://i.imgur.com/uomkVIL.png"
                            position: "top-left"
                            opacity: 0.5
                smartcrop:
                    quality: 80
                    filters:
                      crop:
                        width: 200
                        height: 200
        storages:
             basic: # 从s3检索原始文件
                 kind: "s3"
                 accessKey: "acc"
                 secretAccessKey: "sec"
                 region: ""
                 endpoint: "http://localhost:8080"
             transform: # 存储在磁盘上
                 kind: "local-meta"
                 rootPath: "/var/www/domain/"
                 pathPrefix: "transform"

Docker使用

拉取Docker镜像

docker pull ghcr.io/aldor007/mort

创建自定义Docker部署

创建Dockerfile或使用Dockerfile.service:

# Dockerfile.service 
FROM ghcr.io/aldor007/mort:latest

# 添加你的配置
ADD config.yml /etc/mort/mort.yml

构建容器:

docker build -f Dockerfile.service -t myusername/mort

运行Docker:

docker run -p 8080:8080 myusername/mort

开发指南

  1. 确保安装了Go语言编译器(>=1.9)和git
  2. 按照bimg页面描述安装libvips
  3. 确保GOPATH设置正确
  4. 下载代码:
git clone https://github.com/aldor007/mort.git $GOPATH/src/github.com/aldor007/mort
cd $GOPATH/src/github.com/aldor007/mort
  1. 安装依赖:
go mod vendor

运行单元测试:

make unit

运行集成测试:

make integrations

如果在IDE中运行测试时遇到问题go build gopkg.in/h2non/bimg.v1: invalid flag in pkg-config --cflags: -Xpreprocessor,可以添加以下环境变量:

export CGO_CFLAGS_ALLOW="-Xpreprocessor"

使用Docker镜像运行测试:

make docker-tests

完整示例代码

以下是一个使用Mort进行图像处理的完整示例:

package main

import (
	"fmt"
	"github.com/aldor007/mort/pkg/config"
	"github.com/aldor007/mort/pkg/server"
	"log"
	"net/http"
)

func main() {
	// 创建配置
	cfg := config.Config{
		Headers: []config.HeadersCfg{
			{
				StatusCodes: []int{200},
				Values: map[string]string{
					"cache-control": "max-age=84000, public",
				},
			},
		},
		Buckets: map[string]config.Bucket{
			"demo": {
				Transform: config.Transform{
					Path: `\/(?P<presetName>[a-z0-9_]+)\/(?P<parent>[a-z0-9\-\.]+)`,
					Kind: "presets-query",
					Presets: map[string]config.Preset{
						"small": {
							Quality: 75,
							Filters: map[string]interface{}{
								"thumbnail": map[string]interface{}{
									"width": 150,
								},
							},
						},
						"blur": {
							Quality: 80,
							Filters: map[string]interface{}{
								"thumbnail": map[string]interface{}{
									"width": 700,
								},
								"blur": map[string]interface{}{
									"sigma": 5.0,
								},
							},
						},
					},
				},
				Storages: map[string]config.Storage{
					"basic": {
						Kind:            "s3",
						AccessKey:       "acc",
						SecretAccessKey: "sec",
						Endpoint:        "http://localhost:8080",
					},
					"transform": {
						Kind:       "local-meta",
						RootPath:   "/var/www/domain/",
						PathPrefix: "transform",
					},
				},
			},
		},
	}

	// 创建服务器
	srv, err := server.New(&cfg)
	if err != nil {
		log.Fatal(err)
	}

	// 启动HTTP服务器
	fmt.Println("Starting server on :8080")
	log.Fatal(http.ListenAndServe(":8080", srv.Router()))
}

这个示例展示了如何:

  1. 创建Mort配置
  2. 设置图像处理预设
  3. 配置存储后端
  4. 启动HTTP服务器

你可以根据需要修改配置中的预设和存储设置。


更多关于golang存储与图像处理服务插件库mort的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang存储与图像处理服务插件库mort的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Mort - Go语言图像处理服务插件库

Mort是一个用Go语言编写的图像处理服务插件库,它提供了简单易用的API来处理图像转换、缩放、裁剪等操作。下面我将详细介绍Mort的使用方法。

安装Mort

首先,使用go get命令安装Mort:

go get github.com/aldor007/mort

基本使用

1. 初始化Mort服务

package main

import (
	"log"
	"net/http"
	
	"github.com/aldor007/mort"
	"github.com/aldor007/mort/pkg/config"
	"github.com/aldor007/mort/pkg/response"
)

func main() {
	// 创建Mort配置
	cfg := config.Config{}
	
	// 初始化Mort实例
	m, err := mort.NewMort(cfg)
	if err != nil {
		log.Fatal(err)
	}
	
	// 设置HTTP处理器
	http.Handle("/", m.GetHTTPHandler())
	
	// 启动服务
	log.Println("Starting server on :8080")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

2. 基本图像处理

Mort支持通过URL参数进行图像处理。例如:

http://localhost:8080/image.jpg?width=200&height=150&quality=80

3. 编程方式处理图像

package main

import (
	"bytes"
	"image/jpeg"
	"log"
	"os"
	
	"github.com/aldor007/mort/pkg/processor"
	"github.com/aldor007/mort/pkg/transforms"
)

func main() {
	// 打开原始图像文件
	file, err := os.Open("input.jpg")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()
	
	// 创建图像处理器
	proc := processor.NewProcessor()
	
	// 设置转换参数
	trans := transforms.Transforms{
		Width:   200,
		Height:  150,
		Quality: 80,
	}
	
	// 处理图像
	var buf bytes.Buffer
	err = proc.Process(file, &buf, trans)
	if err != nil {
		log.Fatal(err)
	}
	
	// 将结果保存为新文件
	outFile, err := os.Create("output.jpg")
	if err != nil {
		log.Fatal(err)
	}
	defer outFile.Close()
	
	// 解码处理后的图像以确保有效性
	img, err := jpeg.Decode(&buf)
	if err != nil {
		log.Fatal(err)
	}
	
	// 保存图像
	err = jpeg.Encode(outFile, img, &jpeg.Options{Quality: 80})
	if err != nil {
		log.Fatal(err)
	}
}

高级功能

1. 自定义存储后端

Mort支持多种存储后端,包括本地文件系统、S3等:

cfg := config.Config{
	Buckets: map[string]config.Bucket{
		"default": {
			Storage: config.Storage{
				Kind: "local",
				Local: config.Local{
					Path: "/path/to/images",
				},
			},
		},
	},
}

2. 使用S3存储

cfg := config.Config{
	Buckets: map[string]config.Bucket{
		"default": {
			Storage: config.Storage{
				Kind: "s3",
				S3: config.S3{
					Bucket:   "my-bucket",
					Region:   "us-east-1",
					Key:      "AWS_ACCESS_KEY",
					Secret:   "AWS_SECRET_KEY",
					Endpoint: "s3.amazonaws.com",
				},
			},
		},
	},
}

3. 缓存配置

cfg := config.Config{
	Cache: config.Cache{
		Kind: "memory",
		Memory: config.MemoryCache{
			Size: 100, // MB
		},
	},
}

4. 自定义转换

Mort支持自定义转换管道:

trans := transforms.Transforms{
	Width:  200,
	Height: 150,
	Operations: []transforms.Operation{
		{
			Name: "resize",
			Args: map[string]interface{}{
				"width":  200,
				"height": 150,
			},
		},
		{
			Name: "grayscale",
			Args: map[string]interface{}{},
		},
	},
}

性能优化建议

  1. 启用缓存以减少重复处理
  2. 对于高流量场景,考虑使用Redis作为缓存后端
  3. 合理设置并发处理限制
  4. 使用CDN来分发处理后的图像

错误处理

Mort提供了详细的错误处理机制:

err := proc.Process(file, &buf, trans)
if err != nil {
	switch e := err.(type) {
	case *processor.ImageError:
		log.Printf("Image processing error: %s", e.Message)
	case *processor.TransformError:
		log.Printf("Transform error: %s", e.Message)
	default:
		log.Printf("Unknown error: %v", err)
	}
}

Mort是一个功能强大且灵活的图像处理库,适合构建各种规模的图像处理服务。通过合理配置,它可以满足从简单图像转换到复杂处理管道的各种需求。

回到顶部