Нарисуйте изображение, используя фрагменты изображений - PullRequest
1 голос
/ 16 июня 2020

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

1 Ответ

1 голос
/ 16 июня 2020

Эта строка:

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);

С вашим текущим кодом вы выходите за пределы панели после рисования первого вспомогательного изображения (при условии, что ваша панель * Размер 1007 *.

С этим изменением, похоже, все работает, как ожидалось. Я добавил следующий код в ваш класс MainImage, чтобы получить рабочий пример:

@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();
    }
}
...