Как сделать JPEG без потерь в Java? - PullRequest
6 голосов
/ 01 октября 2011

Кто-нибудь может сказать мне, как написать файл 'jpeg', используя lossless сжатие в Java?

Я прочитал байты, используя приведенный ниже код для редактирования байтов

WritableRaster raster = image.getRaster();
DataBufferByte buffer = (DataBufferByte) raster.getDataBuffer();

И мне нужно снова записать байты как файл jpeg без сжатия в lossy.

1 Ответ

8 голосов
/ 01 октября 2011

Пакет JAI предлагает возможность сохранять форматы JPEG без потерь. Установите тип сжатия на JPEG-LS или JPEG-LOSSLESS в зависимости от того, какой вариант вы хотите.

Я не уверен, что вы действительно хотите JPEG без потерь. Это отдельный формат, который не очень связан с обычным форматом JPEG. В целом, это не очень хорошо поддерживается; для хранения изображений без потерь вам, как правило, лучше с чем-то вроде PNG.

Если вам необходимо выполнить транскодирование изображений без потерь (т. Е. Набор операций обрезки и поворота, которые вы можете выполнять без нарушения границ матриц DCT), вы обычно делаете это с помощью команды jpegtran, поскольку в настоящее время Насколько я знаю, привязка Java к библиотеке IJG.

ETA:

Вы знаете, как это сделать с помощью JAI.

Я сам не пробовал (приведенный ниже код не проверен), но это должен быть прямой вызов setCompressionType. (Конечно, «простой» в Java по-прежнему означает согласование лабиринта извилистых маленьких объектов для установки простого переключения где-либо еще):

ImageWriter writer= (ImageWriter) ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam param= writer.getDefaultWriteParam();
param.setCompressionMode(param.MODE_EXPLICIT);
param.setCompressionType("JPEG-LS");
writer.setOutput(ImageIO.createImageOutputStream(new File(path)));
writer.write(null, new IIOImage(image, null, null), param);

JPEG-LS - это новый стандарт JPEG без потерь. Он сжимает больше, чем оригинальный стандарт JPEG-LOSSLESS, но поддержка еще хуже. Большинство приложений, поддерживающих JPEG, не смогут ничего с этим сделать.

...