在java中并排显示图片
是否可以使用BuffereImage和Graphics2D显示两幅相邻的图片?或者我应该用其他方法来做 在我下面的代码中,我能够显示两个图像,但图片1与图片2重叠在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
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的子级,如果我正确,请检查它是否有助于解决问题。如果它有助于解决问题,请检查。