繁体   English   中英

使用子图像绘制图像

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM