0

我一直在尝试在我的 Go 应用程序中使用 mozjpeg 进行 JPEG 压缩,因为当通过它提供的 cjpeg 命令行实用程序使用时,它的质量似乎非常好。

但是,使用我的应用程序压缩的图片质量较差 - 具有相同质量级别的更多 JPEG 伪像。

我正在使用来自https://github.com/subuk/go-mozjpeg/blob/master/jpeg/compress.go的 libjpeg-turbo / mozjpeg 的 go 绑定

我自己的代码似乎并不太复杂:

    libjpegOptions := jpeg.EncoderOptions{
        Quality:         92,
        OptimizeCoding:  true,
        ProgressiveMode: true,
    }

    err = jpeg.Encode(buf, m, &libjpegOptions)
    if err != nil {
        return nil, err
    }

这两个应用程序似乎都链接到与 Homebrew 一起安装的相同版本的 mozjpeg 库:

$ otool -L /opt/mozjpeg/bin/cjpeg
/opt/mozjpeg/bin/cjpeg:
    /opt/mozjpeg/lib/libjpeg.62.dylib (compatibility version 65.0.0, current version 65.0.0)
    /usr/local/opt/libpng/lib/libpng16.16.dylib (compatibility version 51.0.0, current version 51.0.0)
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.11)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0)

$ otool -L /Users/fabio/Code/go/bin/imageproxy
/Users/fabio/Code/go/bin/imageproxy:
    /opt/mozjpeg/lib/libjpeg.62.dylib (compatibility version 65.0.0, current version 65.0.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1451.0.0)
    /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 58286.41.2)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0)

接下来我可以尝试什么来确保我的应用程序使用与 cjpeg 相同的设置?

4

1 回答 1

2

必须回答我自己的问题,因为我通过查看 mozjpeg 的提交历史找到了解决该问题的方法。cjpeg 在其参数解析代码中对 JPEG 质量等级高于 80 的色度子采样有一个隐含的默认值,并且某些颜色的纯色区域的边界对于色度子采样的库默认值看起来很糟糕。

/*
    Disable chroma subsampling for good quality ratings, that's what cjpeg command does as well.
    That seems to cause some issues with red color.
*/
if opt.Quality >= 80 {
    compInfo := (*[3]C.jpeg_component_info)(unsafe.Pointer(cinfo.comp_info))
    compInfo[Y].h_samp_factor, compInfo[Y].v_samp_factor = 1, 1
    compInfo[Cb].h_samp_factor, compInfo[Cb].v_samp_factor = 1, 1
    compInfo[Cr].h_samp_factor, compInfo[Cr].v_samp_factor = 1, 1
}
于 2018-02-27T10:20:35.277 回答