Вопрос

Я разумно опытный программист Java, но относительно новый для Java2d. Я пытаюсь масштабировать изображение, но получаю низкое качество результатов. Изображение представляет собой предварительный просмотр панели, поэтому содержит такие вещи, как Text и Textfields. Я всегда буду масштабироваться, никогда не вверх.

В настоящее время я использую следующий код:-

g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null);

В тех случаях, когда PanelImage - это полноразмерный предварительный просмотр (BufferedImage), а также масштабируйте и ScaledHeight являются соответствующими целевыми размерами. Кажется, я теряю много деталей в тексте и краях таких вещей, как Textfields и т. Д.

Есть ли лучший звонок, который я должен использовать для масштабирования изображения?

Спасибо, Джон

Это было полезно?

Решение

Предложение, которое я могу сделать, - это сначала изменить размер изображения на отдельный BufferedImage. Анкет Причина в том, что Graphics2D объект BufferedImage можно получить для получения лучшего масштабированного качества изображения.

Graphics2D может принять «намеки на рендеринг», которые инструктируют, как обработка изображений должна выполняться Graphics2D объект. А setRenderingHint Метод является одним из методов, которые можно использовать для установки этих подсказок рендеринга. Рендеринг намекает RenderingHints Класс может быть использован.

Затем, используя это Graphics2D объект, изображение может быть нарисовано на BufferedImage Использование рендеринговых подсказок, указанных ранее.

Грубый (непроверенный) код будет работать следующим образом:

BufferedImage scaledImage = new BufferedImage(
    scaledWidth,
    scaledHeight,
    BufferedImage.TYPE_INT_RGB
);

Graphics2D g = scaledImage.createGraphics();
g.setRenderingHints(
    RenderingHints.Key.KEY_INTERPOLATION,
    RenderingHints.VALUE_INTERPOLATION_BICUBIC
);

g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null);
g.dispose();

Другие подсказки для рендеринга могут включать в себя:

А Контроль качества рендеринга В разделе учебных пособий Java также есть больше информации о том, как контролировать качество рендеринга Graphics2D объекты.

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

Другие советы

Может быть, вам следует позвонить:

 g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

а также

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

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

Пожалуйста, извините за саморекламы здесь, но я перевернул несколько «родных лучших практик Java», когда дело доходит до масштабирования изображений в библиотеку под названием под названием Imgscalr.

Он доступен по лицензии Apache 2, а источник - все на GitHub; Цель библиотеки состояла в том, чтобы сделать масштаб изображений в родной Java Dead-Easy (1 класс, 5 статических методов) и обеспечить наилучший результат (который вы изначально хотели), самый быстрый результат (отличный при масштабировании среди больших изображений ) или баланс между ними и позвольте библиотеке решить, какой из них использовать.

Я просто хотел либера, которая могла бы «изменить размер моего имиджа и уйти с моего пути», и после прочтения всех этих постов в течение нескольких дней, когда я обращался к обезболиванию (моя собственная) просто обошел назад и делился работой для всех иначе это может помочь.

Кобид имеет правильную идею. Я бы тоже попробовал RenderingHints.VALUE_INTERPOLATION_BILINEAR Интерполяция и посмотрите, выглядит ли это лучше. Бикубик работает лучше при масштабировании. Для достижения наилучших результатов при снижении масштабирования следует понижать на несколько шагов. Анкет Сначала подарите вдвое разрешение, затем снова вдвое и т. Д., Пока вы не приблизитесь к желаемому разрешению (т.е. вы не сможете вдвое или изображение станет слишком маленьким). Последний шаг - уменьшить желаемое разрешение.

Например, допустим, что ваше входное изображение 800x600 и вы хотите, чтобы понижались 160x120:

  1. Понижающий 50%. --> 400x300
  2. Понижающий 50%. --> 200x150
  3. Понижаемый до 160x120.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top