Почему файл jpg, который я конвертировал из файла gif, не четкий и нечеткий? - PullRequest
3 голосов
/ 09 июня 2009

Я использую следующий код для преобразования gif-файла в jpg-файл, он работает, но полученный jpg-файл отличается по качеству от исходного gif-файла, почему? Есть ли способ улучшить качество?

try
{
  ImageIO.write(ImageIO.read(new File("C:/abc.gif")),"jpg",new File("C:/abc.jpg"));
}
catch (Exception e) { e.printStackTrace(); }

Итак, чтобы задать этот вопрос под другим углом, с помощью вышеизложенного подхода, как повысить качество продукции?

Ответы [ 4 ]

20 голосов
/ 09 июня 2009

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, будут работать лучше для иллюстраций и линий искусство, где есть большие области подобного цвета с небольшими эффектами градиента.

11 голосов
/ 09 июня 2009

JPEG особенно плох для изображений с текстом внутри. Хорошей альтернативой является .PNG.

5 голосов
/ 09 июня 2009

JPEG гарантирует некоторую потерю в верности; вот так достигается сжатие. Вы можете выбрать другой размер блока, который минимизирует артефакты, но артефакты будут.

GIF без потерь, а JPEG с потерями; abc.jpg никогда не будет пиксельным эквивалентом abc.gif.

2 голосов
/ 09 июня 2009

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

Если изображение нарисовано или содержит большие полосы одного цвета и не является фотографическим, то изображение будет лучше сжато с использованием PNG. Это формат без потерь, который может делать 32-битный цвет.

В наши дни вы почти никогда не должны использовать изображения в формате GIF - формат поддерживает только 8-битный цвет и обеспечивает относительно слабое сжатие.

...