Skip to content

vogo/vimage

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

vimage

图像处理工具库,提供丰富的图像处理功能,包括调整大小、裁剪、马赛克、水印、噪点、验证码生成等。

安装

go get github.com/vogo/vimage

主要功能

  • 图像缩放 (Zoom) - 提供精确的像素级缩放
  • 图像切割 (Cut) - 从图像中切割指定区域
  • 正方形裁剪 (Square)
  • 圆形裁剪 (Circle)
  • 圆角处理 (Rounded Corner)
  • 马赛克处理 (Mosaic)
  • 水印添加 (Watermark)
  • 图像叠加 (Overlay)
  • 智能压缩 (Compress) - 基于内容复杂度分析的智能图像压缩
  • 噪点生成 (Noise)
  • 验证码生成 (Captcha)
  • 表格生成 (Table)
  • 绘制图形 (Draw) - 在图像上绘制圆形、矩形等图形

核心API用法示例

图像处理器框架

// 创建处理器链
processors := []vimage.Processor{
    // 添加多个处理器
    processor1,
    processor2,
    // ...
}

// 处理图片
result, err := vimage.ProcessImage(imgData, processors, nil)

图像缩放 (Zoom)

// 精确缩放(指定宽高)
zoomProcessor := vimage.NewZoomProcessor(width, height)

// 按比例缩放(例如:缩小到原来的50%)
zoomProcessor := vimage.NewZoomRatioProcessor(0.5)

// 按宽度缩放(高度按比例计算)
zoomProcessor := vimage.NewZoomWidthProcessor(300)

// 按高度缩放(宽度按比例计算)
zoomProcessor := vimage.NewZoomHeightProcessor(200)

// 按最大边缩放(保持比例)
zoomProcessor := vimage.NewZoomMaxProcessor(500)

// 按最小边缩放(保持比例)
zoomProcessor := vimage.NewZoomMinProcessor(300)

// 可选:设置缩放算法(默认为双线性插值)
zoomProcessor.WithScaler(draw.BiLinear) // 可选值: draw.NearestNeighbor, draw.ApproxBiLinear, draw.BiLinear, draw.CatmullRom

// 处理图像
zoomedImg, err := zoomProcessor.Process(srcImg)

图像切割 (Cut)

// 使用预定义位置切割矩形区域
// 位置可选: "center", "top", "bottom", "left", "right"
cutProcessor := vimage.NewCutProcessor(width, height, vimage.CutPositionCenter)

// 使用自定义区域切割图像
// x, y 是左上角坐标
cutProcessor := vimage.NewCutProcessorWithRegion(width, height, x, y)

// 处理图像
cutImg, err := cutProcessor.Process(srcImg)

注意: CutProcessor 是统一的切割处理器,同时支持矩形和正方形切割。

正方形裁剪

// 创建正方形裁剪处理器,自动使用较小边的尺寸
// 位置可选: "center", "top", "bottom", "left", "right"
squareProcessor := vimage.NewCutSquareProcessor("center")
squareImg, err := squareProcessor.Process(srcImg)

// 创建指定尺寸的正方形裁剪处理器
squareProcessor := vimage.NewCutSquareProcessorWithSize(100, "center")
squareImg, err := squareProcessor.Process(srcImg)

// 使用自定义坐标裁剪正方形
squareProcessor := vimage.NewCutSquareProcessorWithRegion(100, 50, 50) // size=100, x=50, y=50
squareImg, err := squareProcessor.Process(srcImg)

圆形裁剪

// 创建圆形裁剪处理器
circleProcessor := vimage.NewCutCircleProcessor()

// 处理图像(注意:输入图像必须是正方形)
circleImg, err := circleProcessor.Process(squareImg)

圆角处理

// 创建圆角处理器,指定圆角半径(像素)
roundedProcessor := vimage.NewRoundedCornerProcessor(30)

// 处理图像,将四个角切割成圆角,角外部分变为透明
roundedImg, err := roundedProcessor.Process(srcImg)

马赛克处理

// 定义马赛克区域
regions := []*vimage.MosaicRegion{
    {
        FromX: x1,
        FromY: y1,
        ToX:   x2,
        ToY:   y2,
    },
}

// 处理图像
result, err := vimage.MosaicImage(imgData, regions)

// 或使用更多选项
result, err := vimage.MosaicImageWithOptions(imgData, regions, 0.5, vimage.DirectionLeft)

水印添加

// 创建水印处理器
watermarkProcessor := &vimage.WatermarkProcessor{
    Text:     "水印文本",
    FontSize: 24,
    Color:    color.RGBA{R: 255, G: 255, B: 255, A: 255},
    Opacity:  0.7,
    Position: "bottom-right",
    Rotation: 30,
}

// 处理图像
result, err := watermarkProcessor.Process(srcImg)

图像叠加

// 创建叠加处理器
overlayProcessor := &vimage.OverlayProcessor{
    OverlayImage: overlayImg,
    Position:     "center",
    Opacity:      0.8,
    Scale:        0.5,
}

// 处理图像
result, err := overlayProcessor.Process(srcImg)

智能压缩

智能压缩功能通过分析图像内容复杂度,自动调整压缩参数,在保证图像质量的同时最大化压缩效果。

// 基础用法:使用默认策略压缩到目标文件大小
targetSize := int64(100 * 1024) // 100KB
processor := vimage.NewCompressProcessor(targetSize, vimage.CompressStrategyDefault)

// 处理图像文件字节
compressedBytes, err := processor.ProcessFile(imgBytes)

// 或处理 image.Image 对象
compressedImg, err := processor.Process(srcImg)

压缩策略

vimage 提供了6种预定义的压缩策略,适用于不同的使用场景:

// 1. 默认策略 - 适合大多数场景的通用压缩
processor := vimage.NewCompressProcessor(targetSize, vimage.CompressStrategyDefault)

// 2. 高质量策略 - 优先保证视觉质量,文件大小其次
processor := vimage.NewCompressProcessor(targetSize, vimage.CompressStrategyHighQuality)

// 3. 小文件策略 - 最小化文件大小,可接受质量损失
processor := vimage.NewCompressProcessor(targetSize, vimage.CompressStrategySmallSize)

// 4. 平衡策略 - 在质量和文件大小之间取得平衡
processor := vimage.NewCompressProcessor(targetSize, vimage.CompressStrategyBalanced)

// 5. Web 优化策略 - 针对网页加载速度优化
processor := vimage.NewCompressProcessor(targetSize, vimage.CompressStrategyWebOptimized)

// 6. 缩略图策略 - 生成高质量缩略图
processor := vimage.NewCompressProcessor(targetSize, vimage.CompressStrategyThumbnail)

自定义压缩策略

// 创建自定义压缩策略
customStrategy := &vimage.CompressionStrategy{
    Name:             "自定义策略",
    Description:      "针对特定场景优化",
    MinPixelRatio:    0.4,  // 最小像素比例
    MaxPixelRatio:    0.8,  // 最大像素比例
    PreferredRatio:   0.6,  // 首选像素比例
    QualityLevels:    []int{90, 85, 80, 75}, // 质量级别选项
    DefaultQuality:   85,   // 默认质量
    PreferredFormats: []string{"jpeg", "webp"}, // 优先格式
    DefaultFormat:    "jpeg", // 默认格式
    MaxIterations:    3,    // 最大迭代次数
    Tolerance:        0.08, // 容差范围(±8%)
}

processor := vimage.NewCompressProcessor(targetSize, customStrategy)

高级选项

// 设置输出格式
processor.SetFormat("jpeg") // 支持: "jpeg", "png", "webp"

// 切换压缩策略
processor.SetStrategy(vimage.CompressStrategyWebOptimized)

// 自定义缩放算法(可选)
processor.WithScaler(draw.BiLinear)

// 估算压缩后的文件大小(用于测试)
estimatedSize, err := processor.EstimateFileSize(srcImg)

智能压缩特性

  • 内容感知压缩: 自动分析图像的颜色方差和边缘密度,针对不同复杂度的内容调整压缩参数
  • 性能优化: 使用 Welford's online algorithm 实现单次遍历的方差计算,比传统方法快 45%
  • 类型断言优化: 对 *image.RGBA 图像使用快速路径,直接访问像素缓冲区,性能提升 3-5 倍
  • 灰度值缓存: 在边缘检测中预计算灰度值,减少 75% 的重复计算
  • 采样分析: 对大图像使用采样分析(最大 100x100),在保证准确性的同时提升性能

完整示例

import (
    "os"
    "github.com/vogo/vimage"
)

func CompressImageFile(inputPath, outputPath string, maxSize int64) error {
    // 读取原始图像
    imgBytes, err := os.ReadFile(inputPath)
    if err != nil {
        return err
    }

    // 创建压缩处理器(使用 Web 优化策略)
    processor := vimage.NewCompressProcessor(maxSize, vimage.CompressStrategyWebOptimized)

    // 设置输出格式为 JPEG
    processor.SetFormat("jpeg")

    // 压缩图像
    compressedBytes, err := processor.ProcessFile(imgBytes)
    if err != nil {
        return err
    }

    // 保存压缩后的图像
    return os.WriteFile(outputPath, compressedBytes, 0644)
}

// 使用示例
err := CompressImageFile("/path/to/large.jpg", "/path/to/compressed.jpg", 100*1024)

验证码生成

// 使用默认配置生成验证码
captchaText := "1234"
captchaImg, err := vimage.GenerateCaptcha(captchaText, nil)

// 使用自定义配置
config := &vimage.CaptchaConfig{
    Width:      160,
    Height:     60,
    NoiseLines: 8,
    NoiseDots:  100,
    BgColor:    color.RGBA{R: 240, G: 240, B: 240, A: 255},
    TextColor:  color.RGBA{R: 0, G: 0, B: 200, A: 255},
}
captchaImg, err := vimage.GenerateCaptcha(captchaText, config)

绘制图形

绘制圆形

// 在图像上绘制圆形边框
circleProcessor := vimage.NewDrawCircleProcessor(
    centerX,  // 圆心X坐标
    centerY,  // 圆心Y坐标
    radius,   // 半径
    color.RGBA{R: 255, G: 0, B: 0, A: 255}, // 颜色
    false,    // false = 只绘制边框,true = 填充圆形
)
result, err := circleProcessor.Process(srcImg)

// 绘制填充的圆形
filledCircleProcessor := vimage.NewDrawCircleProcessor(
    100, 100, 50,
    color.RGBA{R: 0, G: 255, B: 0, A: 255},
    true, // 填充圆形
)
result, err := filledCircleProcessor.Process(srcImg)

绘制矩形

// 在图像上绘制矩形边框
rect := image.Rect(x1, y1, x2, y2) // 定义矩形区域
rectProcessor := vimage.NewDrawRectProcessor(
    rect,
    color.RGBA{R: 0, G: 0, B: 255, A: 255}, // 颜色
    false, // false = 只绘制边框,true = 填充矩形
)
result, err := rectProcessor.Process(srcImg)

// 绘制填充的矩形
filledRectProcessor := vimage.NewDrawRectProcessor(
    image.Rect(20, 20, 80, 80),
    color.RGBA{R: 255, G: 255, B: 0, A: 255},
    true, // 填充矩形
)
result, err := filledRectProcessor.Process(srcImg)

// 绘制带有不同边框和填充颜色的矩形
bicolorRectProcessor := vimage.NewDrawRectProcessorWithFillColor(
    image.Rect(20, 20, 80, 80),
    color.RGBA{R: 0, G: 0, B: 255, A: 255},   // 蓝色边框
    color.RGBA{R: 255, G: 255, B: 0, A: 255}, // 黄色填充
)
result, err := bicolorRectProcessor.Process(srcImg)

组合使用示例

// 将图片裁剪为正方形并缩放
func SquareAndZoomImage(imgData []byte, position string, size int) ([]byte, error) {
    // 创建处理器链
    processors := []vimage.Processor{
        // 先裁剪为正方形
        vimage.NewCutSquareProcessor(position),
        // 再缩放
        vimage.NewZoomProcessor(size, size),
    }

    // 处理图片
    return vimage.ProcessImage(imgData, processors, nil)
}

// 将图片裁剪为正方形并应用圆形裁剪
func SquareAndCircleImage(imgData []byte, position string) ([]byte, error) {
    // 创建处理器链
    processors := []vimage.Processor{
        // 先裁剪为正方形
        vimage.NewCutSquareProcessor(position),
        // 再应用圆形裁剪
        vimage.NewCutCircleProcessor(),
    }

    // 处理图片
    return vimage.ProcessImage(imgData, processors, nil)
}

// 按比例缩放图片并添加水印
func ZoomRatioAndWatermark(imgData []byte, ratio float64, watermarkText string) ([]byte, error) {
    // 创建处理器链
    processors := []vimage.Processor{
        // 先按比例缩放
        vimage.NewZoomRatioProcessor(ratio), // 使用新的缩放处理器
        // 再添加水印
        &vimage.WatermarkProcessor{
            Text:     watermarkText,
            FontSize: 24,
            Color:    color.White,
            Opacity:  0.7,
            Position: "bottom-right",
        },
    }

    // 处理图片
    return vimage.ProcessImage(imgData, processors, nil)
}

// 按最大边切割图片并裁剪为圆形
func CutAndCircle(imgData []byte, maxSize int) ([]byte, error) {
    // 创建处理器链
    processors := []vimage.Processor{
        // 先裁剪为正方形
        vimage.NewCutProcessor(maxSize, maxSize, vimage.CutPositionCenter), // 使用新的切割处理器
        // 最后裁剪为圆形
        vimage.NewCutCircleProcessor(),
    }

    // 处理图片
    return vimage.ProcessImage(imgData, processors, nil)
}

// 先切割指定区域再缩放
func CutAndZoom(imgData []byte, cutWidth, cutHeight, x, y int, zoomRatio float64) ([]byte, error) {
    // 创建处理器链
    processors := []vimage.Processor{
        // 先切割指定区域
        vimage.NewCutProcessorWithRegion(cutWidth, cutHeight, x, y),
        // 再按比例缩放
        vimage.NewZoomRatioProcessor(zoomRatio),
    }

    // 处理图片
    return vimage.ProcessImage(imgData, processors, nil)
}

// 缩放图片并添加圆角效果
func ZoomAndRoundedCorner(imgData []byte, width, height, cornerRadius int) ([]byte, error) {
    // 创建处理器链
    processors := []vimage.Processor{
        // 先缩放到指定尺寸
        vimage.NewZoomProcessor(width, height),
        // 再添加圆角效果
        vimage.NewRoundedCornerProcessor(cornerRadius),
    }

    // 处理图片
    return vimage.ProcessImage(imgData, processors, nil)
}

// 压缩图片到指定大小并添加水印
func CompressAndWatermark(imgData []byte, targetSize int64, watermarkText string) ([]byte, error) {
    // 先使用智能压缩处理
    processor := vimage.NewCompressProcessor(targetSize, vimage.CompressStrategyBalanced)
    compressedImg, err := processor.Process(srcImg)
    if err != nil {
        return nil, err
    }

    // 再添加水印
    watermarkProcessor := &vimage.WatermarkProcessor{
        Text:     watermarkText,
        FontSize: 20,
        Color:    color.White,
        Opacity:  0.6,
        Position: "bottom-right",
    }

    return watermarkProcessor.Process(compressedImg)
}

贡献代码

欢迎贡献代码,请遵循以下步骤:

  1. Fork 本仓库
  2. 创建你的特性分支 (git checkout -b feature/amazing-feature)
  3. 提交你的更改 (git commit -m 'Add some amazing feature')
  4. 推送到分支 (git push origin feature/amazing-feature)
  5. 创建一个 Pull Request

开发环境设置

# 克隆仓库
git clone https://github.com/yourusername/vimage.git
cd vimage

# 安装依赖
go mod download

# 安装开发工具
go install github.com/vogo/license-header-checker/cmd/license-header-checker@latest
go install golang.org/x/tools/cmd/goimports@latest
go install mvdan.cc/gofumpt@latest
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

代码规范

  • 所有代码必须通过 golangci-lint 检查
  • 所有新文件必须包含 Apache License 2.0 许可证头
  • 所有函数和类型必须有适当的文档注释
  • 测试覆盖率应尽可能高

构建和测试

# 格式化代码
make format

# 检查许可证头
make license-check

# 运行代码检查
make lint

# 运行测试
make test

# 完整构建流程(包括上述所有步骤)
make build

许可证

Apache License 2.0

About

image utilities

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •