为了账号安全,请及时绑定邮箱和手机立即绑定

在java中并排显示图片

在java中并排显示图片

慕无忌1623718 2022-05-25 16:26:35
是否可以使用 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);    }}
查看完整描述

3 回答

?
红颜莎娜

TA贡献1842条经验 获得超13个赞

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

其次,您需要将第二张图像与第一张图像完全偏移第一张图像的宽度:

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


查看完整回答
反对 回复 2022-05-25
?
墨色风雨

TA贡献1853条经验 获得超6个赞

数学逻辑不正确。请参阅getPreferredSize()计算所需宽度的正确方法的方法,以及paintComponent(Graphics)将它们并排放置的方法的更改。

另一种选择(未在此答案中检查)是将每个图像放入 aJLabel中,然后将标签添加到具有适当布局的面板中。

这是更改的效果:

//img1.sycdn.imooc.com//628de8660001b69f15270465.jpg

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

    }

}


查看完整回答
反对 回复 2022-05-25
?
绝地无双

TA贡献1946条经验 获得超4个赞

每当发生变化并将它们绘制到另一个缓冲图像时,我都会加入图像。然后我可以在需要重新绘制面板时重新绘制组合图像。

//img1.sycdn.imooc.com//628de8770001aa5605270292.jpg

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

            }

        });

    }

}


查看完整回答
反对 回复 2022-05-25
  • 3 回答
  • 0 关注
  • 241 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号