在java中并排显示图片

是否可以使用 BufferedImage 和 Graphics2D 并排显示两张图片?还是我应该用其他方法来做?


在下面的代码中,我能够显示两个图像,但图片 1 与图片 2 重叠。


package zdjecie;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;


import javax.imageio.ImageIO;

import javax.swing.JPanel;


public class ObrazPanel extends JPanel {


    private BufferedImage image;

    private BufferedImage image2;


    public ObrazPanel() {

        super();


    File imageFile = new File("C:\\Users\\KostrzewskiT\\eclipse-workspace\\zdjecie\\src\\zdjecie\\java.jpg");

    File imageFile2 = new File("C:\\Users\\KostrzewskiT\\eclipse-workspace\\zdjecie\\src\\zdjecie\\java2.jpg"); 


        try {

            image = ImageIO.read(imageFile);

            image2 = ImageIO.read(imageFile2);

        } catch (IOException e) {

            System.err.println("Blad odczytu obrazka");

            e.printStackTrace();

        }



        Dimension dimension = new Dimension(image.getWidth(), image.getHeight());

        setPreferredSize(dimension);

        Dimension dimension2 = new Dimension(image2.getWidth(), image2.getHeight());

        setPreferredSize(dimension2);

    }



    @Override

    public void paintComponent(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;

        g2d.drawImage(image, 0, 0, this);

        g2d.drawImage(image2, 200, 200, this);

    }

}


慕无忌1623718
浏览 242回答 3
3回答

红颜莎娜

你打setPreferredSize了两次电话,结果第一次电话基本上什么也没做。这意味着您始终拥有preferredSize等于第二张图像的尺寸。您应该做的是将大小设置为new Dimension(image.getWidth() + image2.getWidth(), image2.getHeight())假设两者具有相同的高度。如果不是这种情况,请将 设置height为两个图像的最大值。其次,您需要将第二张图像与第一张图像完全偏移第一张图像的宽度:g2d.drawImage(image, 0, 0, this); g2d.drawImage(image2, image.getWidth(), 0, this);

墨色风雨

数学逻辑不正确。请参阅getPreferredSize()计算所需宽度的正确方法的方法,以及paintComponent(Graphics)将它们并排放置的方法的更改。另一种选择(未在此答案中检查)是将每个图像放入 aJLabel中,然后将标签添加到具有适当布局的面板中。这是更改的效果:import java.awt.*;import java.awt.image.BufferedImage;import javax.swing.*;import java.net.*;import javax.imageio.ImageIO;public class ObrazPanel extends JPanel {    private BufferedImage image;    private BufferedImage image2;    public ObrazPanel() throws MalformedURLException {        super();        URL imageFile = new URL("https://i.stack.imgur.com/7bI1Y.jpg");        URL imageFile2 = new URL("https://i.stack.imgur.com/aH5zB.jpg");        try {            image = ImageIO.read(imageFile);            image2 = ImageIO.read(imageFile2);        } catch (Exception e) {            System.err.println("Blad odczytu obrazka");            e.printStackTrace();        }    }    @Override    public Dimension getPreferredSize() {        int w = image.getWidth() + image2.getWidth();        int h1 = image.getHeight();        int h2 = image2.getHeight();        int h = h1>h2 ? h1 : h2;        return new Dimension(w,h);    }    @Override    public void paintComponent(Graphics g) {        // always best to start with this..         super.paintComponent(g);        Graphics2D g2d = (Graphics2D) g;        g2d.drawImage(image, 0, 0, this);        g2d.drawImage(image2, image.getWidth(), 0, this);    }    public static void main(String[] args) {        Runnable r = new Runnable() {            @Override            public void run() {                try {                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());                } catch (Exception useDefault) {                }                ObrazPanel o;                try {                    o = new ObrazPanel();                    JFrame f = new JFrame(o.getClass().getSimpleName());                    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);                    f.setLocationByPlatform(true);                    f.setContentPane(o);                    f.pack();                    f.setMinimumSize(f.getSize());                    f.setVisible(true);                } catch (MalformedURLException ex) {                    ex.printStackTrace();                }            }        };        SwingUtilities.invokeLater(r);    }}

绝地无双

每当发生变化并将它们绘制到另一个缓冲图像时,我都会加入图像。然后我可以在需要重新绘制面板时重新绘制组合图像。import java.awt.*;import java.awt.image.BufferedImage;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.*;public class SideBySideImagePanel extends JPanel {    private static final long serialVersionUID = 5868633578732134172L;    private BufferedImage left;    private BufferedImage right;    private BufferedImage join;    public SideBySideImagePanel() {        ClassLoader loader = this.getClass().getClassLoader();        BufferedImage left = null, right = null;        try {            left = ImageIO.read(loader.getResourceAsStream("resources/Android.png"));            right = ImageIO.read(loader.getResourceAsStream("resources/Java.png"));        } catch (IOException e) {            e.printStackTrace();        }        this.setLeft(left);        this.setRight(right);    }    public BufferedImage getLeft() {        return left;    }    public void setLeft(BufferedImage left) {        this.left = left;    }    public BufferedImage getRight() {        return right;    }    public void setRight(BufferedImage right) {        this.right = right;    }    @Override    public void invalidate() {        super.invalidate();        join = combineImages(left, right);        setPreferredSize(new Dimension(join.getWidth(), join.getHeight()));    }    @Override    public void paintComponent(Graphics g) {        g.drawImage(join, 0, 0, null);    }    private BufferedImage combineImages(BufferedImage left, BufferedImage right) {        int width = left.getWidth() + right.getWidth();        int height = Math.max(left.getHeight(), right.getHeight());        BufferedImage combined = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);         Graphics g = combined.getGraphics();        g.drawImage(left, 0, 0, null);        g.drawImage(right, left.getWidth(), 0, null);        return combined;    }    public static void main(String[] args) {        SwingUtilities.invokeLater(new Runnable() {            @Override            public void run() {                JFrame frame = new JFrame("Image Joiner");                SideBySideImagePanel panel = new SideBySideImagePanel();                frame.getContentPane().add(panel);                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                frame.setLocationRelativeTo(null);                frame.pack();                frame.setVisible(true);            }        });    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java