Пакет 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, не смогут ничего с этим сделать.