Существует два варианта просмотра кода:
Исходное изображение очень большое, а миниатюра очень маленькое, что приводит к ухудшению качества изображения в результате простой билинейной интерполяции .
артефакты сжатия , возникающие в результате кодирования 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);