golang高效Web图片转换与优化插件transformimgs的使用

Golang高效Web图片转换与优化插件transformimgs的使用

logo

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性能测试可以针对服务运行。运行测试:

  1. 启动性能测试环境:
$ docker-compose -f docker-compose-perf.yml up
  1. 运行JMeter测试:
$ jmeter -n -t perf-test.jmx -l ./results.jmx -e -o ./results
  1. 运行JMeter WebP测试:
$ jmeter -n -t perf-test-webp.jmx -l ./results-webp.jmx -e -o ./results-webp
  1. 运行JMeter AVIF测试:
$ jmeter -n -t perf-test-avif.jmx -l ./results-avif.jmx -e -o ./results-avif
  1. 运行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

1 回复

更多关于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)
}

性能优化建议

  1. 批量处理:如果需要处理大量图片,考虑使用goroutine池
  2. 内存管理:处理大图片时注意内存使用,可以分块处理
  3. 缓存策略:对处理结果进行缓存,避免重复处理
  4. 格式选择:根据场景选择合适的格式,WebP通常比JPEG/PNG更高效

transformimgs库提供了强大的图片处理能力,同时保持了良好的性能表现,非常适合Web应用中的图片处理需求。

回到顶部