показ картинок рядом в яве - PullRequest
0 голосов
/ 28 января 2019

возможно ли отобразить две картинки рядом друг с другом с помощью 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);
    }
}

Ответы [ 4 ]

0 голосов
/ 28 января 2019

Логика математики была неверной.См. Метод getPreferredSize() для правильного расчета необходимой ширины и изменения метода paintComponent(Graphics) для их размещения рядом.

Альтернатива (в этом ответе не рассматривается)поместите каждое изображение в JLabel, затем добавьте метки на панель с соответствующим макетом.

Это влияние изменений:

enter image description here

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);
    }
}
0 голосов
/ 28 января 2019

Я обнаружил некоторые ошибки в вашем коде и не понял, что вы пытаетесь сделать ...

1] Там вы фактически не используете первую настройку

    Dimension dimension = new Dimension(image.getWidth(), image.getHeight());
    setPreferredSize(dimension); //not used
    Dimension dimension2 = new Dimension(image2.getWidth(), image2.getHeight());
    setPreferredSize(dimension2); //because overridden by this

Это означает, что панель имеет размеры такие же, как image2, вы должны установить ее следующим образом:

  • высота как максимальная высота обоих изображений
  • ширина как минимумсуммируя ширину обеих картинок (если вы хотите нарисовать их на одной панели, как вы пытаетесь)

2], что такое типы данных image и image2?в приведенном выше блоке у вас есть File, но с другими именующими переменными, File класс класса не имеет аргумента ширины или высоты

Я предполагаю, что Image должное использование в Graphics.drawImageзатем:

Вам необходимо установить предпочтительный размер , как я уже говорил:

  • высота до максимального значения высоты из изображений
  • ширина как минимумкак суммарное значение каждой ширины

Размеры вещи:

Dimension panelDim = new Dimension(image.getWidth() + image2.getWidth(),Math.max(image.getHeight(),image2.getHeight()));
setPreferredSize(panelDim)

Тогда вы можете рисовать изображения в исходном размере - из-за координат, имеющих0; 0 в левом верхнем углу и в правом нижнем углу это this.getWidth ();this.getHeight () - проверьте, например. это объяснение - вам нужно начать рисовать в левом нижнем углу, а затем перейти к правильному положению, увеличивая "X", так как ширина первого изображения

@Override
public void paintComponent(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
        /* public abstract boolean drawImage(Image img,
        int x,
        int y,
        Color bgcolor,
        ImageObserver observer)
        */
    //start to paint at [0;0]
    g2d.drawImage(image, 0, 0, this); 
    //start to paint just on the right side of first image (offset equals to width of first picture)- next pixel on the same line, on the bottom of the screen 
    g2d.drawImage(image2,image2.getWidth()+1, 0, this);
}

У меня не былошанс проверить это, но так и должно быть.Важные вещи:

  • , вам нужно иметь правильные размеры для подгонки обоих изображений
  • Координаты экрана начинаются в левом верхнем углу экрана [0; 0]
0 голосов
/ 28 января 2019

Я присоединяюсь к изображениям, когда что-то меняется, и рисую их в другом буферизованном изображении.Затем я могу просто перерисовать объединенное изображение всякий раз, когда необходимо перерисовать панель.

Application

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);
            }
        });
    }
}
0 голосов
/ 28 января 2019

Вы звоните setPreferredSize дважды, в результате чего первый вызов практически ничего не делает.Это означает, что у вас всегда есть preferredSize, равный размерам второго изображения. следует *1003* сделать, чтобы установить размер new Dimension(image.getWidth() + image2.getWidth(), image2.getHeight()), предполагая, что оба имеют одинаковую высоту.Если это не так, установите height как максимум обоих изображений.

Во-вторых, вам необходимо сместить второе изображение от первого изображения точно на ширину первого изображения:

g2d.drawImage(image, 0, 0, this);
g2d.drawImage(image2, image.getWidth(), 0, this);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...