【发布时间】:2021-09-05 16:12:53
【问题描述】:
我正在尝试获取图像像素的 RGB 值。 (鼠标经过的像素)。这是添加图像的代码和处理鼠标的代码::
/// I got this code somewhere from StackOverFlow;
///Couldn't find the link;
label = new JLabel();
try {
// THIS PICTURE IS NOT MINE
targetImg = ImageIO.read(new java.net.URL("https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSFAhy8GM1F3_TyPjG7ezbeFRUy00PN4hpJCA&usqp=CAU"));
label.setIcon(new ImageIcon(rescale(targetImg)));
panel1.add(label);
fields = new JPanel();
fields.setBorder(new EmptyBorder(5, 5, 5, 5));
red = new JTextField(3);
green = new JTextField(3);
blue = new JTextField(3);
red.setEditable(false);
green.setEditable(false);
blue.setEditable(false);
fields.add(red);
fields.add(green);
fields.add(blue);
panel1.add(fields);
label.addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
try{
int packedInt = targetImg.getRGB(e.getX(), e.getY());
Color color = new Color(packedInt, true);
fields.setBackground(color);
red.setText(Integer.toString(color.getRed()));
green.setText(Integer.toString(color.getGreen()));
blue.setText(Integer.toString(color.getBlue()));
}
catch (ArrayIndexOutOfBoundsException exception) { }
}
});
} catch (IOException ex) {
ex.printStackTrace();
}
这可以正常运行和编译;但是,有时RGB返回的颜色不是我的鼠标所在的颜色;这是一张图片::
https://i.stack.imgur.com/R5qIx.png
注意:白色十字是它所在位置的大概位置;屏幕截图显然也不用鼠标。
代码也很滞后。有时它会挂在一个像素上,我必须等到它再次运行。
为什么会发生这种情况,我可以做些什么来防止这种情况发生?我该如何解决这个问题?
【问题讨论】:
-
rescale是做什么的?如果它如其名称所述,您不应该在重新缩放的图像上调用getRGB,而不是原始图像吗? -
发布minimal reproducible example 来演示问题,因此我们不必问上述问题。 有时它会挂在一个像素上 - 不要使用空的 catch 块。如果您没有任何异常代码,您如何知道何时出现异常?您应该显示异常消息。我猜你得到了异常,因为你有一个重新缩放的图像。
-
注意,如果你想防止延迟,你应该使用 invokeLater 在 EDT 线程上运行任何 GUI 代码,就像
SwingUtilities.invokeLater(new Runnable(){public void run(){fields.setBackground(color);;}});
标签: java swing jpanel rgb mouselistener