Как я могу создать не квадратный BufferedImage из не квадратного файла изображения? - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь создать BufferedImage из произвольного файла изображения, а затем отцентрировать это изображение на фоне JPanel.У меня нет проблем с квадратными изображениями, но я не могу понять, как обрабатывать неквадратные изображения.

Некоторые отладки указывают, что (непосредственная) проблема заключается в том, что когда я использую ImageIO для созданияBufferedImage из прямоугольного входного файла, скажем, 256x128, BufferedImage.getHeight () возвращает 256, а не 128.

Вот фрагмент кода, приближающий мой код:

class ExtendedPanel extends JPanel {

    static final int WIDTH = 400;
    static final int HEIGHT = 400;

    BufferedImage image;

    public ExtendedPanel(File f) {
       super();
       setPreferredSize(new Dimension(WIDTH,HEIGHT));
       image = ImageIO.read(f);
    }

    @Override
    public void paintComponent(Graphics g) {
        int x = (WIDTH - image.getWidth())/2;
        int y = (HEIGHT - image.getHeight())/2;
        Graphics2D g2d = (Graphics2d)g;
        g2d.drawRenderedImage(image,AffineTransform.getTranslateInstance(x,y));
    }

}

Как я уже сказал, этохорошо для квадратных файлов изображений.Но с прямоугольными изображениями, которые шире, чем они высокие, изображение отображается выше, чем должно быть.Я еще не пробовал с изображениями выше, чем они широкие, но я боюсь, что в этом случае изображение будет отображаться слишком далеко влево.Что я могу сделать?

1 Ответ

0 голосов
/ 13 февраля 2019

Это скорее проблема (понимания) правильного расчета.

public void paintComponent(Graphics g) {
    Graphics2D g2d = (Graphics2d)g;

    // How to scale the image:
    double xscale = ((double)WIDTH) / image.getWidth();
    double yscale = ((double)HEIGHT) / image.getHeight());

    // When scaling proportionally:
    double scale = Math.min(xscale, yscale); // max for covering entire panel.
    xscale = scale;
    yscale = scale;

    double w = scalex * image.getWidth();
    double h = scaley * image.getHeight();
    double x = (getWidth() - w) / 2;
    double y = (getHeight() - h) / 2;
    g.drawImage(img, (int)x, (int)y, (int)w, (int)h, Color.BLACK, null);
    //g2d.translate(x, y);
    //g2d.scale(xscale, yscale);
    //g2d.draw...;
}

При использовании простой (масштабируемой) версии drawImage все, что нужно, совершенно ясно.

Дляучитывается пропорциональное масштабирование, заполнение целиком (потеря части изображения) или увеличение до максимального размера (при просмотре фона).

...