Как получить 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); }