如何从非正方形图像文件创建非正方形BufferedImage?

时间:2019-02-13 16:07:53

标签: java bufferedimage javax.imageio

我正在尝试从任意图像文件创建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 :(得分:0)

更多的是(正确理解)正确计算的问题。

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的简单(缩放)版本是完全清楚的。

要考虑的是按比例缩放,完全填充(图像部分丢失)或最大尺寸(见背景)。