首页 > 解决方案 > 在Java中将单击的像素的颜色更改为红色?

问题描述

当我单击图像的像素时,我希望将该像素更改为红色。我对 Java 中的图形没有太多经验,所以我可能遗漏了一些重要的东西。感谢您提供的任何帮助。

public class Main {
static BufferedImage image;

public static void main(String[] args) {
    try {
        image = ImageIO.read(new File("pic.png"));
    } catch (IOException e) {
        e.printStackTrace();
    }

    JFrame frame = new JFrame();
    frame.getContentPane().setLayout(new FlowLayout());
    JLabel label = new JLabel(new ImageIcon(image));

    // change the pixels to random colors when hovering over them

    label.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            super.mouseClicked(e);
            System.out.println("CLICKED: " + "(" + e.getX() + "," + e.getY() + ")");
            //getColorOfPixel(e.getX(), e.getY());
            changeColorOfPixel(e.getX(), e.getY());
        }
    });

    frame.getContentPane().add(label);
    frame.pack();
    frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    frame.setVisible(true);
}

public static void changeColorOfPixel(int xCoordinateClicked, int yCoordinateClicked) {

    int width = image.getWidth();
    int height = image.getHeight();

    int[][] pixels = new int[width][height];

    for(int i = 0; i < width; i++) {
        for(int j = 0; j < height; j++) {
            pixels[i][j] = image.getRGB(xCoordinateClicked, yCoordinateClicked);

            if(i == xCoordinateClicked && j == yCoordinateClicked) {

                Color newColor = Color.RED;

                image.setRGB(xCoordinateClicked, yCoordinateClicked, newColor.getRGB());
            }
        }
    }
}
}

标签: java

解决方案


您需要frame.repaint();在像素颜色更改后调用,因此例如只需更改MouseAdapter类似这样的定义(假设frame也将定义为static

    label.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            super.mouseClicked(e);

            System.out.println("CLICKED: " + "(" + e.getX() + "," + e.getY() + ")");
            image.setRGB(e.getX(), e.getY(), Color.RED.getRGB());
            frame.repaint();
        }
    });

推荐阅读