почему мое изображение в Java-приложении портится, когда оно масштабируется шире? (включая код, чтобы показать проблему) - PullRequest
1 голос
/ 13 февраля 2010

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

Вот испорченный дисплей:

альтернативный текст http://www.freeimagehosting.net/uploads/35105d3017.jpg

Это когда я делаю окно (JFrame) немного широким, поэтому оно становится нормальным:

альтернативный текст http://www.freeimagehosting.net/uploads/a2580d86b1.jpg

(Обратите внимание, что я показал только верхнюю часть изображения, поэтому трава в испорченной версии отсутствует во второй)

Полный код, демонстрирующий это:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;


public class Imager {

 /**
  * @param args
  */
 public static void main(String[] args) {
  JFrame frame = new JFrame();
  ImageComponent component = new ImageComponent("P1010013.JPG");
  frame.add(component);
  frame.setPreferredSize(new Dimension(300, 300));
  frame.pack();
  frame.setVisible(true);
 }

 static class ImageComponent extends JComponent {
  Image img;
  ImageComponent(String file) {
   InputStream inputStream;
   try {
    inputStream = new FileInputStream(file);
    img = ImageIO.read(inputStream);
   } catch (FileNotFoundException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }

  protected void paintComponent(Graphics g) {
   super.paintComponent(g);
   // g.drawImage(img, 0, 0, 100, 100, null);
   g.drawImage(img, 0, 0, 1000, 1000, null);
  }

 }

}

Ответы [ 2 ]

2 голосов
/ 15 февраля 2010

(перенесено из комментариев): расширение JComponent может быть частью проблемы. Поскольку JComponent по умолчанию не является непрозрачным, фон не будет очищен как часть процесса перекраски. Использование JPanel (непрозрачно по умолчанию, но в остальном довольно похоже на JComponent) может решить проблему.

2 голосов
/ 13 февраля 2010

Вам необходимо создать свой графический интерфейс в потоке диспетчеризации событий (EDT) .

Приложение 1: Вот полный пример.

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Imager {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new ImagePanel("P1010013.JPG"));
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    private static class ImagePanel extends JPanel {

        BufferedImage img;

        ImagePanel(String name) {
            super(true);
            try {
                img = ImageIO.read(new File(name));
                this.setPreferredSize(new Dimension(
                    img.getWidth(), img.getHeight()));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        protected void paintComponent(Graphics g) {
            g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), null);
        }
    }
}

Кроме того, Эш прав насчет масштабирования. Попробуйте g.drawImage(img, 0, 0, null); вместо.

Приложение 2: Вы можете определить, рисуете ли вы на EDT , используя isEventDispatchThread().

Приложение 3: Я расширил пример выше.

Приложение 4: Как Эш отмечает : «Если вы не соблюдаете непрозрачное свойство, вы, вероятно, увидите визуальные артефакты».

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