【问题标题】:How can I create a non-square BufferedImage from a non-square image file?如何从非方形图像文件创建非方形 BufferedImage?
【发布时间】:2019-02-13 16:07:52
【问题描述】:

我正在尝试从任意图像文件创建一个 BufferedImage,然后将该图像置于 JPanel 的背景中。我对方形图像没有任何问题,但我不知道如何处理非方形图像。

一些调试表明(直接的)问题是,当我使用 ImageIO 从矩形输入文件(比如 256x128)创建 BufferedImage 时,BufferedImage.getHeight() 返回 256 而不是 128。

这是一个近似于我的代码的 sn-p:

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));
    }

}

正如我所说,这适用于方形图像文件。但是对于宽于高的矩形图像,图像显示得比应有的高。我还没有尝试过使用比宽度更高的图像,但我担心在这种情况下图像会显示在左侧太远。我能做什么?

【问题讨论】:

    标签: java bufferedimage javax.imageio


    【解决方案1】:

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

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

    要考虑按比例缩放、完全填充(丢失图像部分)或达到最大尺寸(查看背景)。

    【讨论】:

    • 谢谢。我还没有考虑缩放问题,因为我必须使用的所有测试图像都是 256x256 或更小。事实证明,我的问题是我为 BufferedImage 编写的用于保存位置和旋转信息以及图像本身的包装类中的错字,但我已将您的答案添加为书签以供将来参考。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多