Как получить Java-упаковщик для libjpeg-turbo для фактического сжатия?

У меня проблемы с получением libjpeg-turbo в моем Java-проекте для фактического сжатия изображения. Он пишет.jpg отлично, но конечный размер результата всегда, например, почти такой же, как 24-битные окна.bmp того же изображения. Изображение размером 480x854 превращается в 1,2-мегабайтный JPEG-файл с приведенным ниже фрагментом кода. Если я использую выборку GREY, то это 800 КБ (и это не фантастические изображения для начала - в основном нейтральный фон с заполненными дисками основного цвета на них для игры, над которой я работаю).

Вот код, который я получил до сих пор:

// для некоторого байта [] src в формате RGB888, представляющего изображение размеров // 'width' и 'height'
try
{
    TJCompressor tjc = new TJCompressor(
            src,
            width
            0,  // "pitch" - высота размера строки сканирования TJ.PF_RGB  // формат);
    tjc.setJPEGQuality(75);
    tjc.setSubsamp(TJ.SAMP_420);
    byte[] jpg_data = tjc.compress(0); новый java.io.FileOutputStream(новый java.io.File("/tmp/dump.jpg")).write(jpg_data, 0, jpg_data.length);
}
catch(Exception e)
{
    e.printStackTrace(System.err);
}

Мне особенно трудно найти образец документации по использованию Java для этого проекта; это в основном предполагает фон C / использование. Я не понимаю флаги, которые нужно передать сжатию (и при этом я не знаю внутренности стандарта jpeg и не хочу:)!

Спасибо!

1 ответ

Doh! И через 5 минут после отправки вопроса ответ меня ударил.

Шифрование результата показало, что конец файла для этих изображений был просто множеством нулей.

Для любого, кто столкнется с подобной ситуацией в будущем, вместо использования jpg_data.length (которое по некоторым причинам слишком велико), используйте TJCompressor.getCompressedSize() сразу после вызова TJCompressor.compress().

Конечный результат становится:

// для некоторого байта [] src в формате RGB, представляющего изображение измерений
// 'ширина и высота'
пытаться
{
    TJCompressor tjc = новый TJCompressor(ЦСИ,
            ширина
            0,  // "шаг" - размер строки сканирования
            рост
            TJ.PF_RGB  // формат);
    tjc.setJPEGQuality(75);
    tjc.setSubsamp(TJ.SAMP_420);
    byte[] jpg_data = tjc.compress(0);
    int actual_size = tjc.getCompressedSize();
    новый java.io.FileOutputStream(новый java.io.File("/tmp/dump.jpg")).
            write(jpg_data, 0, actual_size);
}
поймать (исключение е)
{
    e.printStackTrace(System.err);
}
Другие вопросы по тегам