在Java中获取像素的颜色

时间:2013-12-29 04:52:25

标签: java

我有一个棋盘,将特定方块的颜色设为蓝色(Color.BLUE),我希望在用户点击蓝色方块时知道该程序。我知道点击的X和Y坐标,但我该怎么做?其他人创建一个图像,然后使用.getRGB(),但还有另一种方式吗?

4 个答案:

答案 0 :(得分:3)

是的还有另一种更好的方法! 由于您已经有xy坐标点击,您现在可以检查这些坐标在棋盘网格中的位置,并且您可以确切地知道点击了哪个方框。< / p>

由于棋盘方块是由您在特定坐标处渲染的,我猜是这样,您可以执行算法将xy坐标与 square 的坐标进行比较将具有位置

如果这没有帮助让我知道更多细节,那么我可以帮助你。

答案 1 :(得分:3)

你不应该试图“获得像素的颜色”。处理棋盘的逻辑知道棋盘布局是什么以及它着色的是什么像素,因此它应该保留足够的这些信息,以便它可以分辨出被点击的正方形。执行此操作的OOP方法是:定义一个类Chessboard,其目的是表示在窗口中绘制的棋盘(或Swing组件,或其他)。应该有一种绘制棋盘的方法;该方法将跟踪用于绘制每个方块的像素范围。 (由于每个方块可能具有相同的高度和宽度,因此您实际上不需要保留像素坐标数组;仅保留棋盘左上角的坐标就足够了,您将添加类似width * columnNumberheight * rowNumber获取每个方块的坐标。)有关绘制方块的位置的数据将位于Chessboard的成员字段中。然后你可以添加一个方法,询问Chessboard“什么方形包含坐标X和Y处的像素?”。我遗漏了很多细节,但我认为这是解决这个问题的最佳方法。

答案 2 :(得分:3)

我会存储一个Rectangle数组,并在点击时查找哪一个包含该点。

Chessboard Image

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ChessBoard extends JPanel {

    public static final int SIZE = 400;
    public static final int COUNT = 8;
    public static final int TILE_SIZE = SIZE / COUNT;
    public static final Color RED = Color.RED;
    public static final Color BLUE = Color.BLUE;

    public static Tile[][] tiles;

    static {
        ChessBoard c = new ChessBoard();

        tiles = new Tile[COUNT][COUNT];

        for (int i = 0; i < COUNT; i++) {
            for (int j = 0; j < COUNT; j++) {
                tiles[i][j] = c.new Tile(i * TILE_SIZE, j * TILE_SIZE,
                        TILE_SIZE, TILE_SIZE);
            }
        }
    }

    public static void main(String[] args) {
        JFrame f = new JFrame();
        ChessBoard c = new ChessBoard();

        f.setTitle("Chessboard Tile Click");
        f.setContentPane(c);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

    public ChessBoard() {
        setPreferredSize(new Dimension(SIZE, SIZE));

        this.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                Point p = e.getPoint();

                for (int i = 0; i < COUNT; i++) {
                    for (int j = 0; j < COUNT; j++) {
                        Rectangle tile = tiles[i][j];

                        if (tile.contains(p)) {
                            JOptionPane.showMessageDialog(null,
                                    String.format("Clicked Tile: %s", tile));
                            break;
                        }
                    }
                }
            }
        });
    }

    @Override
    protected void paintComponent(Graphics g) {
        boolean flip = false;

        for (int i = 0; i < COUNT; i++) {
            for (int j = 0; j < COUNT; j++) {
                Rectangle tile = tiles[i][j];

                g.setColor((flip = !flip) ? BLUE : RED);
                g.fillRect(tile.x, tile.y, TILE_SIZE, TILE_SIZE);

                g.setColor(Color.WHITE);
                g.drawString(tile.toString(), tile.x + (TILE_SIZE / 2) - 8,
                        tile.y + (TILE_SIZE / 2) + 6);
            }
            flip = !flip;
        }
    }

    private class Tile extends Rectangle {
        public Tile(int x, int y, int width, int height) {
            super(x, y, width, height);
        }

        @Override
        public String toString() {
            return String.format("%c%d", 'A' + x / TILE_SIZE, COUNT - y
                    / TILE_SIZE);
        }
    }
}

答案 3 :(得分:1)

尝试使用像素的颜色是不正确的......我很害怕。不,这样做:

  1. 使用鼠标x和y确定单击了哪个方格。

  2. 使用您用于确定“特定”方块的相同规则以蓝色:确定所点击方块的性质并采取相应的操作。