我一直在尝试在我的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相同的设置?
发布于 2018-02-27 18:20:35
我必须回答我自己的问题,因为我通过查看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
}https://stackoverflow.com/questions/48991531
复制相似问题