Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中并排显示图片_Java_Swing_Javax.imageio - Fatal编程技术网

在java中并排显示图片

在java中并排显示图片,java,swing,javax.imageio,Java,Swing,Javax.imageio,是否可以使用BuffereImage和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.sw

是否可以使用BuffereImage和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);
    }
}
您两次调用setPreferredSize,这导致第一次调用基本上什么也不做。这意味着您的首选大小始终等于第二个图像的尺寸。您应该做的是将大小设置为新的Dimensionimage.getWidth+image2.getWidth,image2.getHeight,假设两者具有相同的高度。如果不是这样,则将高度设置为两幅图像的最大值

其次,您需要将第二个图像与第一个图像精确偏移第一个图像的宽度:

g2d.drawImage(image, 0, 0, this);
g2d.drawImage(image2, image.getWidth(), 0, this);
您两次调用setPreferredSize,这导致第一次调用基本上什么也不做。这意味着您的首选大小始终等于第二个图像的尺寸。您应该做的是将大小设置为新的Dimensionimage.getWidth+image2.getWidth,image2.getHeight,假设两者具有相同的高度。如果不是这样,则将高度设置为两幅图像的最大值

其次,您需要将第二个图像与第一个图像精确偏移第一个图像的宽度:

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

我在你的代码中发现了一些错误,我不知道你想做什么

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
这意味着,面板的尺寸与图像2相同,您应该按如下方式进行设置:

高度作为两个图像高度的最大值 宽度至少是两幅图片宽度的总和,如果您想在同一个面板中绘制它们,请尝试 2] 图像和图像2数据类型是什么?在上面的块中,您有文件,但有不同的命名变量,文件类当然没有宽度或高度参数

我假设它在Graphics.drawImage中有适当的用途,那么:

您需要设置我提到的首选尺寸:

高度到图像高度的最大值 宽度至少为每个宽度的汇总值 维度事物:

Dimension panelDim = new Dimension(image.getWidth() + image2.getWidth(),Math.max(image.getHeight(),image2.getHeight()));
setPreferredSize(panelDim)
然后您可以按原始大小绘制图像 -应有的坐标为0;左上角和右下角的0为this.getWidth;这是我的身高 -检查。 -您需要在左下角开始绘制,然后移动到正确的位置,增加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]
我在你的代码中发现了一些错误,我不知道你想做什么

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
这意味着,面板的尺寸与图像2相同,您应该按如下方式进行设置:

高度作为两个图像高度的最大值 宽度至少是两幅图片宽度的总和,如果您想在同一个面板中绘制它们,请尝试 2] 图像和图像2数据类型是什么?在上面的块中,您有文件,但有不同的命名变量,文件类当然没有宽度或高度参数

我假设它在Graphics.drawImage中有适当的用途,那么:

您需要设置我提到的首选尺寸:

高度到图像高度的最大值 宽度至少为每个宽度的汇总值 维度事物:

Dimension panelDim = new Dimension(image.getWidth() + image2.getWidth(),Math.max(image.getHeight(),image2.getHeight()));
setPreferredSize(panelDim)
然后您可以按原始大小绘制图像 -应有的坐标为0;左上角和右下角的0为this.getWidth;这是我的身高 -检查。 -您需要在左下角开始绘制,然后移动到正确的位置,增加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]
每当有什么变化时,我就会加入这些图像,并将它们绘制到另一个缓冲图像中。然后,只要面板需要重新绘制,我就可以重新绘制组合图像


每当有什么变化时,我就会加入这些图像,并将它们绘制到另一个缓冲图像中。然后,只要面板需要重新绘制,我就可以重新绘制组合图像


数学的逻辑是错误的。有关计算所需宽度的正确方法,请参见getPreferredSize方法,以及对paintComponentGraphics方法所做的更改,以将它们并排放置

本答案中未讨论的另一种方法是将每个图像放入JLabel中,然后将标签添加到具有适当布局的面板中

这就是这些变化的影响:


数学的逻辑是错误的。有关计算所需宽度的正确方法,请参见getPreferredSize方法,以及对paintComponentGraphics方法所做的更改,以将它们并排放置

本节未讨论的替代方案 答案是将每个图像放入JLabel中,然后将标签添加到具有适当布局的面板中

这就是这些变化的影响:


如果它们重叠,是因为你没有正确定位它们吗?那么如何正确定位它们呢?Steve?我认为你的设置更喜欢SizeDimension;代码是错误的,因为您在JPanel上调用它。你希望这会改变图像的大小吗?改变g2d.DrawImage2200200中的值,这个;所以它们不会重叠。与BuffereImage和Graphics2D一起-为什么?只需从BuffereImage创建一个ImagIcon,并使用ImageIcon创建一个JLabel。然后,您只需将标签添加到面板中,就可以使用任何要显示图像的布局管理器。JPanel的默认FlowLabel并排显示图像。如果图像重叠,是因为您没有正确定位它们吗?那么如何正确定位它们?Steve?我认为您的设置更喜欢SizeDimension;代码是错误的,因为您在JPanel上调用它。你希望这会改变图像的大小吗?改变g2d.DrawImage2200200中的值,这个;所以它们不会重叠。与BuffereImage和Graphics2D一起-为什么?只需从BuffereImage创建一个ImagIcon,并使用ImageIcon创建一个JLabel。然后,您只需将标签添加到面板中,就可以使用任何要显示图像的布局管理器。JPanel的默认FlowLabel,并排显示图像。image和image2是BuffereImage。它也应该工作,BuffereImage是image的子级,如果我是correctimage,image2是BuffereImage。它也应该工作,BuffereImage是Image的子级,如果我正确,请检查它是否有助于解决问题。如果它有助于解决问题,请检查。