Получение низкого качества миниатюры из высококачественного изображения в Java - PullRequest
1 голос
/ 23 июля 2011

Я попробовал приведенный ниже код для создания высококачественного миниатюрного изображения, но ноготь большого пальца был размытым и не настолько ясным.

BufferedImage thumbImage = new BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics2D = thumbImage.createGraphics();
graphics2D.setBackground(Color.WHITE);
graphics2D.setPaint(Color.WHITE); 
graphics2D.fillRect(0, 0, thumbWidth, thumbHeight);
graphics2D.setComposite(AlphaComposite.Src);
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2D.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);
graphics2D.dispose();      
File file = new File(thumbnailFile);
if (javax.imageio.ImageIO.write(thumbImage, "JPG", file))
    return file;
}

Исходное изображение высокого качества. Почему миниатюрное изображение искажается и имеет низкое качество?

1 Ответ

10 голосов
/ 23 июля 2011

Существует два варианта просмотра кода:

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

  2. артефакты сжатия , возникающие в результате кодирования JPEG, ухудшают качество эскиза.

Использование простой билинейной интерполяции может быть целесообразным, если исходное изображение и миниатюра не отличаются по размеру в целом, например, от 200x200 до 100x100.

Однако, когда дело доходит до изменения размера изображений большого размера (например, 1600x1200) до изображения с уменьшенным размером, билинейной интерполяции (и в этом случае бикубической интерполяции), поэтому следует использовать альтернативные методы, такие как многошаговое изменение размера.

Статья Криса Кэмпбелла Опасности Image.getScaledInstance () содержит более подробные сведения о том, как и почему уменьшение больших изображений может привести к ухудшению качества изображения.

В книге Грязные богатые клиенты Чета Хааза и Ромена Гая также подробно рассказывается о создании высококачественных миниатюр.


Я поддерживаю библиотеку генерации миниатюр под названием Thumbnailator , в которой используются такие методы, как многоэтапное изменение размера, для создания высококачественных миниатюр с помощью простого в использовании API.

Например, ваш пример кода может быть написан с помощью Thumbnailator, например так:

Thumbnails.of(image)
  .size(thumbWidth, thumbHeight)
  .outputFormat("JPG")
  .toFile(file);

Также можно указать параметры качества сжатия, если артефакты сжатия вызывают ухудшение качества изображения:

Thumbnails.of(image)
  .size(thumbWidth, thumbHeight)
  .outputFormat("JPG")
  .outoutQuality(0.9)
  .toFile(file);
...