Уменьшите размер изображения JPEG без масштабирования его ширины/высоты с помощью Java

Я хочу уменьшить размер изображения в формате jpeg (3M уменьшить до 1M) с помощью Java без масштабирования (без изменения высоты и ширины изображения). НА этом сайте я не смог найти решение. Ниже то, что я пробовал:

1 Использование ImageIO:

BufferedImage image  = ImageIO.read(inputFile);

ImageWriter writer = null;
Iterator iter = ImageIO.getImageWritersByFormatName("jpg");
if(iter.hasNext()){
    writer = (ImageWriter) iter.next();
}

ImageOutputStream ios = ImageIO.createImageOutputStream(outputFile);
writer.setOutput(ios);

ImageWriteParam iwParam = writer.getDefaultWriteParam();
iwParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwParam.setCompressionQuality(compressionQuality);
writer.write(null, new IIOImage(image, null, null ), iwParam);

Для решения 1 я установил CompressQuality для jpg, но я не могу получить исходное изображение CompressQuality, и новое изображение, которое я получаю, иногда больше, чем оригиналы.


person shijie xu    schedule 23.03.2012    source источник


Ответы (2)


Используемое качество сжатия не сохраняется вместе с изображением JPEG.

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

Я не знаком с флагом MODE_EXPLICIT. Это также может быть настраиваемый параметр.

person Thorbjørn Ravn Andersen    schedule 23.03.2012
comment
Спасибо за ваш ответ. MODE_EXPLICT ДОЛЖЕН быть установлен ... Тем не менее, использование ImageIO не гарантирует, что размер может быть уменьшен, как вы сказали, исходное качество не может быть обнаружено ... Я использовал другой способ jai(coderanch.com/t/383601/java/java/decrease- size-jpeg-image-file) и это работает.. - person shijie xu; 23.03.2012

Я нашел следуя примеру кода для снижения качества.

Важная часть — просто установить iwp.setCompressionQuality. Надеюсь, это поможет.

BufferedImage bi = null;

bi = ImageIO.read(new File("image.jpg"));

Iterator iter = ImageIO.getImageWritersByFormatName("jpeg");
ImageWriter writer = (ImageWriter) iter.next();

ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);

// reduced quality.
iwp.setCompressionQuality(0.1f);

File file = new File("c:/image_low.jpg");

FileImageOutputStream output = null;

output = new FileImageOutputStream(file);

writer.setOutput(output);

IIOImage image = new IIOImage(bi, null, null);
writer.write(null, image, iwp);

writer.dispose();
person Reg    schedule 23.03.2012
comment
Это то же самое, что я написал выше. Установите CompressionQuality = 0,1, чтобы добиться максимального сжатия, но слишком сильно снизить качество. Я нашел другое решение на coderanch.com/t/383601/java/java/decrease-size-jpeg-image-file, но мне не нравится, как это работает все же. - person shijie xu; 23.03.2012