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

Я хочу уменьшить размер изображения в формате 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 я установил сжатие качества для jpg, но не могу получить оригинальное изображение обжать качество, а получаемый мной новый образ иногда больше оригиналов.

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

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

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

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

1 голос
/ 23 марта 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();
...