JPEG - это формат сжатия с потерями , который отбрасывает информацию, которую человеческие глаза не могут заметить очень хорошо. Однако, в зависимости от настроек качества изображения при сжатии изображения, артефакты сжатия , такие как блочность и пятно, могут стать видимыми - это причина того, что изображение не выглядит четким.
Возможно, что метод ImageIO.write
сохраняет JPEG с более низким качеством, чем необходимо, чтобы изображение выглядело достаточно хорошо.
Чтобы установить более высокое значение качества, необходимо будет использовать ImageWriteParam
для задания параметров качества изображения, а затем использовать ImageWriter
для вывода JPEG.
Например:
// Get a writer for JPEG.
ImageWriter iw = ImageIO.getImageWritersByFormatName("jpeg").next();
iw.setOutput(new FileImageOutputStream(outputFile));
// Set the compression quality to 0.9f.
ImageWriteParam iwParam = iw.getDefaultWriteParam();
iwParam.setCompressionQuality(0.9f);
// Write image
iw.write(null, new IIOImage(imageToWrite, null, null), iwParam);
Методы интереса:
Тем не менее, как уже упоминалось в других ответах, JPEG не подходит для сжатия текста и иллюстраций. Если цель состоит в том, чтобы сохранить качество изображения, но размер файла может быть больше, чем при сжатии с JPEG, то использование формата сжатия без потерь , такого как PNG , сохранит качество изображения как есть, без потерь. Однако во многих случаях размер файла PNG будет больше, чем JPEG. (Но это не всегда так.)
Общее правило: для фотографий и других реалистичных изображений форматы сжатия с потерями, такие как JPEG, будут хорошо работать для соотношения размера и качества, в то время как форматы сжатия без потерь, такие как PNG, будут работать лучше для иллюстраций и линий искусство, где есть большие области подобного цвета с небольшими эффектами градиента.