首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将mozjpeg与其cjpeg一起使用比将其用作库具有更高的质量

将mozjpeg与其cjpeg一起使用比将其用作库具有更高的质量
EN

Stack Overflow用户
提问于 2018-02-26 23:10:07
回答 1查看 943关注 0票数 0

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

然而,使用我的应用程序压缩的图片质量较差--相同质量级别的JPEG工件要多得多。

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

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

代码语言:javascript
复制
    libjpegOptions := jpeg.EncoderOptions{
        Quality:         92,
        OptimizeCoding:  true,
        ProgressiveMode: true,
    }

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

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

代码语言:javascript
复制
$ 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相同的设置?

EN

回答 1

Stack Overflow用户

发布于 2018-02-27 18:20:35

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

代码语言:javascript
复制
/*
    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
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48991531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档