golang高效Web图片转换与优化插件transformimgs的使用
Golang高效Web图片转换与优化插件transformimgs的使用
TransformImgs简介
TransformImgs是一个开源的图片CDN,提供图片转换API并支持最新的图片格式,如WebP、AVIF、Jpeg XL等。它的目标是提供零配置API,根据输入自动做出决策,无需提供额外的参数如质量、输出格式、压缩类型等。
主要特性
- 调整大小/优化/裁剪光栅(PNG和JPEG)图片
- 基于"Accept"头支持JpegXL/AVIF/WebP
- Vary头支持 - 可部署在任何CDN后面
- 响应式图片支持,包括高DPI(视网膜)显示
- Save-Data支持
快速开始
在quickstart/
文件夹中有一个在反向代理后运行API的示例。运行方式:
cd quickstart
docker-compose up
open https://localhost
API接口
API有4个HTTP端点:
/img/{IMG_URL}/optimise
- 优化图片/img/{IMG_URL}/resize
- 调整图片大小/img/{IMG_URL}/fit
- 通过调整大小和裁剪将图片调整为精确尺寸/img/{IMG_URL}/asis
- 返回原始图片
本地运行
Docker方式
最新docker镜像发布在Docker Hub上。启动服务器:
$ docker run -p 8080:8080 pixboost/transformimgs [OPTIONS]
验证:
- 健康检查:
curl http://localhost:8080/health
- 转换:
open http://localhost:8080/img/https://images.unsplash.com/photo-1591769225440-811ad7d6eab3/resize?size=600
选项
选项 | 描述 | 默认值 |
---|---|---|
cache | 缓存图片的秒数(0表示禁用缓存)。用于max-age HTTP响应 | 2592000 (30天) |
proc | 要运行的图片处理器数量 | CPU核心数 |
disableSaveData | 如果设置为true,则禁用Save-Data客户端提示。应在不支持Vary头中Save-Data头的CDN上禁用 | false |
从源代码运行
先决条件:
- Go 1.18+ 支持模块
- 在
/usr/local/bin
中安装支持AVIF的imagemagick v7.0.25+
安装说明命令:
cd illustration/
go install
运行应用:
./run.sh
在Go Web应用中使用
您可以使用service.GetRouter方法轻松地将HTTP路由插入现有的Web应用程序中。这里有一个如何实现的示例。
完整示例
以下是一个完整的Go示例,展示如何在Web应用中使用transformimgs:
package main
import (
"github.com/Pixboost/transformimgs/v8/pkg/service"
"log"
"net/http"
)
func main() {
// 创建transformimgs服务
imgService, err := service.New(&service.Config{
Cache: 2592000, // 30天缓存
Processors: 0, // 使用CPU核心数
DisableSaveData: false,
})
if err != nil {
log.Fatalf("Failed to create image service: %v", err)
}
// 创建路由器
router := http.NewServeMux()
// 添加transformimgs路由
router.Handle("/img/", imgService.GetRouter())
// 添加其他路由
router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Welcome to image transformation service!"))
})
// 启动服务器
log.Println("Starting server on :8080")
log.Fatal(http.ListenAndServe(":8080", router))
}
性能测试
有一个JMeter性能测试可以针对服务运行。运行测试:
- 启动性能测试环境:
$ docker-compose -f docker-compose-perf.yml up
- 运行JMeter测试:
$ jmeter -n -t perf-test.jmx -l ./results.jmx -e -o ./results
- 运行JMeter WebP测试:
$ jmeter -n -t perf-test-webp.jmx -l ./results-webp.jmx -e -o ./results-webp
- 运行JMeter AVIF测试:
$ jmeter -n -t perf-test-avif.jmx -l ./results-avif.jmx -e -o ./results-avif
- 运行JMeter JPEG XL测试:
$ jmeter -n -t perf-test-jxl.jmx -l ./results-jxl.jmx -e -o ./results-jxl
贡献
欢迎提出任何想法。PRs更是欢迎。
许可证
MIT
更多关于golang高效Web图片转换与优化插件transformimgs的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang高效Web图片转换与优化插件transformimgs的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang高效Web图片转换与优化插件transformimgs使用指南
transformimgs是一个高效的Golang图片处理库,专门为Web应用设计,提供图片转换、压缩和优化功能。下面我将详细介绍它的使用方法。
安装transformimgs
首先安装transformimgs库:
go get github.com/pierrre/imageserver/transformimgs
基本功能与使用示例
1. 图片格式转换
package main
import (
"bytes"
"image/jpeg"
"image/png"
"log"
"net/http"
"github.com/pierrre/imageserver"
"github.com/pierrre/imageserver/transformimgs"
)
func main() {
// 原始PNG图片
imgData := []byte{...} // 这里填入你的图片数据
// 创建转换器
converter := transformimgs.NewConverter(transformimgs.ConverterParams{
Format: "jpeg", // 转换为JPEG格式
Quality: 85, // 设置JPEG质量
})
// 执行转换
source := imageserver.NewSourceImage(imgData)
result, err := converter.Convert(source)
if err != nil {
log.Fatal(err)
}
// 获取转换后的数据
convertedData, err := result.Get()
if err != nil {
log.Fatal(err)
}
// 可以直接用于HTTP响应
http.HandleFunc("/image", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "image/jpeg")
w.Write(convertedData)
})
log.Println("Server started on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
2. 图片尺寸调整
func resizeImageHandler(w http.ResponseWriter, r *http.Request) {
// 读取原始图片
imgData, err := os.ReadFile("original.jpg")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 创建尺寸转换器
resizer := transformimgs.NewResizer(transformimgs.ResizerParams{
Width: 800, // 目标宽度
Height: 600, // 目标高度
Mode: transformimgs.ResizeModeFit, // 保持比例适应
})
// 执行转换
source := imageserver.NewSourceImage(imgData)
result, err := resizer.Resize(source)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 获取结果
resizedData, err := result.Get()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "image/jpeg")
w.Write(resizedData)
}
3. 图片质量优化
func optimizeImageHandler(w http.ResponseWriter, r *http.Request) {
// 读取原始图片
imgData, err := os.ReadFile("original.jpg")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 创建优化器
optimizer := transformimgs.NewOptimizer(transformimgs.OptimizerParams{
Quality: 75, // 目标质量
StripMetadata: true, // 移除元数据
Progressive: true, // 渐进式JPEG
CompressionLevel: 6, // PNG压缩级别
})
// 执行优化
source := imageserver.NewSourceImage(imgData)
result, err := optimizer.Optimize(source)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 获取结果
optimizedData, err := result.Get()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "image/jpeg")
w.Write(optimizedData)
}
高级功能
1. 组合多个转换操作
func processImageHandler(w http.ResponseWriter, r *http.Request) {
imgData, err := os.ReadFile("original.png")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 创建处理链
processor := transformimgs.NewProcessorChain(
transformimgs.NewResizer(transformimgs.ResizerParams{
Width: 1200,
Height: 0, // 自动计算高度保持比例
Mode: transformimgs.ResizeModeFit,
}),
transformimgs.NewConverter(transformimgs.ConverterParams{
Format: "webp", // 转换为WebP格式
Quality: 80,
}),
transformimgs.NewOptimizer(transformimgs.OptimizerParams{
StripMetadata: true,
}),
)
// 执行处理
source := imageserver.NewSourceImage(imgData)
result, err := processor.Process(source)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
processedData, err := result.Get()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "image/webp")
w.Write(processedData)
}
2. 缓存处理结果
var imageCache = make(map[string][]byte)
func cachedImageHandler(w http.ResponseWriter, r *http.Request) {
filename := r.URL.Query().Get("file")
if filename == "" {
http.Error(w, "Missing file parameter", http.StatusBadRequest)
return
}
// 检查缓存
if cached, ok := imageCache[filename]; ok {
w.Header().Set("Content-Type", "image/jpeg")
w.Write(cached)
return
}
// 处理图片
imgData, err := os.ReadFile(filename)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
processor := transformimgs.NewProcessorChain(
transformimgs.NewResizer(transformimgs.ResizerParams{Width: 800}),
transformimgs.NewOptimizer(transformimgs.OptimizerParams{Quality: 80}),
)
source := imageserver.NewSourceImage(imgData)
result, err := processor.Process(source)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
processedData, err := result.Get()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// 存入缓存
imageCache[filename] = processedData
w.Header().Set("Content-Type", "image/jpeg")
w.Write(processedData)
}
性能优化建议
- 批量处理:如果需要处理大量图片,考虑使用goroutine池
- 内存管理:处理大图片时注意内存使用,可以分块处理
- 缓存策略:对处理结果进行缓存,避免重复处理
- 格式选择:根据场景选择合适的格式,WebP通常比JPEG/PNG更高效
transformimgs库提供了强大的图片处理能力,同时保持了良好的性能表现,非常适合Web应用中的图片处理需求。