Java combine ImageIcons

#java

#java

Вопрос:

У меня есть небольшая Java-программа, которая использует ImageIcons на JLabels для отображения изображений. Я хочу взять два ImageIcon, объединить их в один ImageIcon и прикрепить это новое изображение к JLabel, так что что-то вроде:

 ImageIcon img1 = new ImageIcon("src/inc/img/pic1.png");
ImageIcon img2 = new ImageIcon("src/inc/img/pic2.png");
//combine the two into a new Image
// ? ImageIcon newImg = img1 img2;
  

Я просто не уверен, как это сделать, это просто должно быть так, как будто я открыл два файла изображений в paint и скопировал один поверх середины другого (pic2 примерно вдвое меньше pic1) Какие-нибудь советы?

Ответ №1:

Я не пробовал этого, но вы должны быть в состоянии сделать что-то подобное (нарисовать их рядом)

 Image image1 = img1.getImage(); 
Image image2  = img2.getImage();
int w = image1.width   image2.width;
int h = Math.max(image1.height, image2.height);
Image image = new BufferedImage(w, h,  TYPE_INT_RGB);
Graphics2D g2 = image.createGraphics();
g2.drawImage(image1, 0, 0, null);
g2.drawImage(image2, image1.width, 0, null);
g2.dispose();

ImageIcon newImg = new ImageIcon(image);
  

Комментарии:

1. Несколько небольших изменений, чтобы второе изображение было сосредоточено на первом, и оно отлично сработало, спасибо

Ответ №2:

Понял, что работает с этим:

     @Test
    public void testIcon() throws IOException, InterruptedException {
        File file1 = new File("/etc/alternatives/start-here-32.png");
        File file2 = new File("/etc/alternatives/start-here-24.png");

        BufferedImage img1 = ImageIO.read(file1);
        BufferedImage img2 = ImageIO.read(file2);

        img1.getGraphics().drawImage(img2, 0, 0, img2.getWidth(null), img2.getHeight(null), 0, 0, img2.getWidth(null), img2.getHeight(null), null);
        showImage(img1);
        Thread.sleep(10000);
    }
  

Вот метод ShowImage:

      public void showImage(final BufferedImage image) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        JPanel imagePanel = new JPanel() {
            @Override
            public void paint(java.awt.Graphics g) {
                g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), 0, 0, image.getWidth(), image.getHeight(), null);

            };
        };

        frame.getContentPane().add(imagePanel, BorderLayout.CENTER);
        frame.setSize(new Dimension(image.getWidth()   100, image.getHeight()   100));
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
  

Ответ №3:

Класс Compound Icon предоставляет вам гибкость для комбинирования значков различными способами.