Разместить Java-образ в JFrame - PullRequest
1 голос
/ 03 февраля 2011

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

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

Я думаю, что я пытаюсь понять, что, вероятно, я делаю что-то не так при уменьшении размера изображения. Так есть ли в Java метод, позволяющий автоматически делать это без потери качества изображения?

То же поведение, что и у JButton, где Java автоматически корректирует пространство, занимаемое JButton в JPanel.

      bufferedImage = resize(bufImage,500,600);

    ImageIcon imageIcon = new ImageIcon(bufferedImage);

    resizedIMage = imageIcon.getImage();

Фактический размер ниже. Я взял это из интернета.

      private static BufferedImage resize(BufferedImage image, int width, int      height) {
        int type = image.getType() == 0? BufferedImage.TYPE_INT_ARGB :     image.getType();
      BufferedImage resizedImage = new BufferedImage(width, height, type);
      Graphics2D g = resizedImage.createGraphics();
      g.setComposite(AlphaComposite.Src);

      g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
      RenderingHints.VALUE_INTERPOLATION_BILINEAR);

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

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

      g.drawImage(image, 0, 0, width, height, null);
      g.dispose();
      return resizedImage;
    } 

Ответы [ 3 ]

2 голосов
/ 03 февраля 2011

Если вы используете Java 5 или новее, вы можете попробовать RenderingHints.VALUE_INTERPOLATION_BICUBIC для подсказки по интерполяции.

В этой статье приведено очень подробное описание различных способов масштабирования Java2D: perils-of-getScaledInstance

Содержит примеры различных результатов уменьшения масштаба, которые вы можете ожидать при использовании различных подходов, доступных в Java.

Он также предоставляет пример кода, который использует многоступенчатый подход для уменьшения изображения, что, по-видимому, дает гораздо лучшие результаты, чем VALUE_INTERPOLATION_BILINEAR.

1 голос
/ 03 февраля 2011

Переопределите метод paintComponent(Graphics g) любого компонента, который будет отображать изображение и смотреть на Графику. drawImage ()

Вы можете даже преобразовать свой экземпляр Graphics в Graphics2D для получения дополнительных функциональных возможностей. Например setRenderingHings ()

Graphics2D g2 = (Graphics2D) g;
RenderingHints rh = g2.getRenderingHints ();
rh.put (RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHints (rh);
0 голосов
/ 03 февраля 2011

Я бы избавился от этого:

int type = image.getType() == 0? BufferedImage.TYPE_INT_ARGB :     image.getType();

И всегда используйте BufferedImage.TYPE_INT_ARGB

Это, кажется, дает мне хорошие результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...