Можно ли изменить алгоритм сжатия, используемый Java ImageWriter при создании JPEG?

Или, в качестве альтернативы, есть ли лучшая библиотека для обработки сжатия?

Позвольте мне предварить это тем, что я уже понимаю: (1) JPEG с потерями — он не будет выглядеть так же, как входной файл. (2) Я могу настроить качество сжатия на что-то между 0,0 и 1,0, как я сделал в коде ниже.

Я беру BufferedImage и преобразовываю его в JPEG, и я замечаю, что метод .write() Java ImageWriter дает результаты ниже номинала для изображений JPEG (по сравнению с Photoshop «Сохранить для Интернета», например).

Мой код сейчас выглядит примерно так:

// img is a BufferedImage, here
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(.75f);

IIOImage image = new IIOImage(img, null, null);
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
writer.setOutput(ImageIO.createImageOutputStream(byteArrayOut));
writer.write(null, image, iwp);
writer.dispose();

Игра с настройкой качества сжатия приводит к разным результатам качества, но даже при настройке «1.0» они выглядят не так хорошо, как то, что я могу получить с помощью других инструментов. при создании JPEG.

Поскольку я новый пользователь и пока не могу публиковать изображения... вот веб-страница, демонстрирующая различия. Надеюсь, я смогу разместить их здесь на постоянной основе в какой-то момент для будущих пользователей, у которых может возникнуть аналогичный вопрос.

Очевидно, что это конкретное изображение не является лучшим кандидатом на сжатие JPEG (формат PNG намного меньше и не имеет потерь), но позволяет легче увидеть артефакты сжатия. Фактические изображения будут в основном фотографическими по своей природе. По крайней мере, это больше ставит под сомнение алгоритм и качество сжатия JPEG в Java по сравнению с другими, которые производят изображения, которые выглядят ближе к оригиналу с меньшим количеством байтов.

5
задан timehat 6 June 2012 в 23:41
поделиться