Использование mozjpeg с его cjpeg имеет превосходное качество по сравнению с использованием его в качестве библиотеки

Я пытался использовать mozjpeg в своем приложении Go для сжатия JPEG, так как он, кажется, имеет очень хорошее качество при использовании через утилиту командной строки cjpeg, которую он предоставляет.

Однако изображения, сжатые моим приложением, имеют худшее качество - гораздо больше артефактов JPEG с тем же уровнем качества.

Я использую привязки go для libjpeg-turbo / mozjpeg с https://github.com/subuk/go-mozjpeg/blob/master/jpeg/compress.go

Мой собственный код не кажется слишком сложным:

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

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

Кажется, что оба приложения ссылаются на одну и ту же версию библиотеки mozjpeg, установленной вместе с Homebrew:

$ 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?

1 ответ

Должен ответить на мой собственный вопрос, так как я нашел решение этой проблемы, пройдя историю коммитов в 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
}
Другие вопросы по тегам