[英]Draw Image using subimages
我正在尝试使用其子图像绘制图像。 但是,在我尝试绘制之后,JPanel 上没有单个图像。 有人可以解释为什么吗? 我需要在哪里填充数组? 构造函数paintComponent或其他地方? 代码:
public class MainImage extends JPanel implements CONST {
BufferedImage image = getScaledImage(ImageIO.read(new File("Image/p1.jpg")),MAIN_IMAGE_WIDTH,MAIN_IMAGE_HEIGHT);
BufferedImage[][] subImages = new BufferedImage[SMALL_IMAGE_COEFICIENT][SMALL_IMAGE_COEFICIENT];
public MainImage() throws IOException {
addSubImages(image);
}
/** STOLEN FROM https://riptutorial.com/java/example/28299/how-to-scale-a-bufferedimage*/
private BufferedImage getScaledImage(Image srcImg, int w, int h){
BufferedImage resizedImg = new BufferedImage(w, h, BufferedImage.TRANSLUCENT);
Graphics2D g2 = resizedImg.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.drawImage(srcImg, 0, 0, w, h, null);
g2.dispose();
return resizedImg;
}
private void addSubImages(BufferedImage img){
for(int row = 0;row<SMALL_IMAGE_COEFICIENT;row++){
for(int col = 0; col<SMALL_IMAGE_COEFICIENT;col++){
subImages[row][col] = image.getSubimage(col*SMALL_IMAGE_WIDTH,row*SMALL_IMAGE_HEIGHT,SMALL_IMAGE_WIDTH,SMALL_IMAGE_HEIGHT);
}
}
}
public void draw(Graphics2D g){
for(int row = 0;row<SMALL_IMAGE_COEFICIENT;row++){
for(int col = 0; col<SMALL_IMAGE_COEFICIENT;col++){
g.drawImage(subImages[row][col],col*MAIN_IMAGE_WIDTH,row*MAIN_IMAGE_HEIGHT,null);
}
}
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
var g2d = (Graphics2D) g;
draw(g2d);
}
}
public interface CONST {
int MAIN_IMAGE_WIDTH = 500;
int MAIN_IMAGE_HEIGHT = 500;
int SMALL_IMAGE_COEFICIENT = 50;
int SMALL_IMAGE_HEIGHT = MAIN_IMAGE_HEIGHT/ SMALL_IMAGE_COEFICIENT;
int SMALL_IMAGE_WIDTH = MAIN_IMAGE_WIDTH/ SMALL_IMAGE_COEFICIENT;
}
这一行:
g.drawImage(subImages[row][col],col*MAIN_IMAGE_WIDTH,row*MAIN_IMAGE_HEIGHT,null);
应该
g.drawImage(subImages[row][col],col*SMALL_IMAGE_WIDTH,row*SMALL_IMAGE_HEIGHT,null);
使用您当前的代码,您在绘制第一个子图像后走出面板(假设您的面板的大小为MAIN_IMAGE_WIDTH x MAIN_IMAGE_HEIGHT
。
随着这种变化,事情似乎按预期工作。 我将以下代码添加到您的MainImage
class 以获得一个工作示例:
@Override
public Dimension getPreferredSize()
{
return new Dimension(MAIN_IMAGE_WIDTH, MAIN_IMAGE_HEIGHT);
}
public static void main(String[] args)
{
try
{
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new MainImage());
f.pack();
f.setVisible(true);
}
catch(Exception e)
{
e.printStackTrace();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.