Java: 如何从不可见的面板中获取检查颜色
Java: How got check colors from an invisible panel
是否可以读取不可见面板的鼠标位置的颜色?
我想要一个带有颜色编码图像的 "invisible overlay"。
我使用 Robot class 来获取我的鼠标位置和颜色。
public void mouseClicked(MouseEvent evt){
Robot r = new Robot();
Point p = evt.getLocationOnScreen();
Color color = r.getPixelColor(p.x,p.y);
System.out.println(color);
}
它在我的可见图像上运行良好,但如果我将图像设置为不可见,它就会完全被忽略。
有没有办法获得相同的结果(获取我的鼠标位置的颜色),但对于不可见的 image/panel?
编辑:其他问题(希望允许)也对我有帮助:
是否可以获得单个 JLayeredPane 的颜色(我的鼠标位置)?
我使用几个带有小图像的 JLayeredPanes。它们都具有相同的大小,但部分透明,因此它们创建了一个大图像,我可以在其中更改其中的单个部分。
我的问题也将得到解决,如果我能够获得单个 JLayeredPane 的颜色(我的鼠标位置),分别可以检查它是否透明。
您可以创建任何组件的 BufferedImage
。一旦你有了 BufferedImage
,你就可以使用 getRGB(…)
方法来获取像素的颜色。
创建任何组件的 BufferedImage
的最简单方法是使用 Screen Image class。您可以创建框架的图像、框架上的任何组件或组件的任何矩形区域。
在下面的示例中,右侧的标签是不可见组件的图像。当您在左侧的空白标签周围移动鼠标时,背景将更改为指示不可见组件上像素的颜色:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.event.*;
public class InvisibleImage extends JPanel
{
public InvisibleImage()
{
setLayout( new GridLayout(0, 2) );
JLabel invisible = new JLabel( new ImageIcon("mickeyred.jpg") );
invisible.setVisible( false );
BufferedImage image = ScreenImage.createImage( invisible );
JLabel panel = new JLabel();
panel.setOpaque( true );
add(panel);
JLabel label = new JLabel( new ImageIcon( image ) );
add(label);
panel.addMouseMotionListener( new MouseMotionAdapter()
{
@Override
public void mouseMoved(MouseEvent e)
{
int pixelColor = image.getRGB(e.getX(), e.getY());
Color color = new Color( pixelColor );
panel.setText( color.toString() );
panel.setBackground( color );
}
});
}
private static void createAndShowGUI()
{
JFrame frame = new JFrame("InvisibleImage");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new InvisibleImage() );
frame.pack();
frame.setLocationByPlatform( true );
frame.setVisible( true );
}
public static void main(String[] args) throws Exception
{
java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
}
}
如果您不想使用 ScreenImage
class 那么您可以使用以下方法创建 BufferedImage:
invisible.setSize( invisible.getPreferredSize() );
Dimension d = invisible.getSize();
BufferedImage image = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
invisible.print( g2d );
g2d.dispose();
是否可以读取不可见面板的鼠标位置的颜色? 我想要一个带有颜色编码图像的 "invisible overlay"。 我使用 Robot class 来获取我的鼠标位置和颜色。
public void mouseClicked(MouseEvent evt){
Robot r = new Robot();
Point p = evt.getLocationOnScreen();
Color color = r.getPixelColor(p.x,p.y);
System.out.println(color);
}
它在我的可见图像上运行良好,但如果我将图像设置为不可见,它就会完全被忽略。 有没有办法获得相同的结果(获取我的鼠标位置的颜色),但对于不可见的 image/panel?
编辑:其他问题(希望允许)也对我有帮助: 是否可以获得单个 JLayeredPane 的颜色(我的鼠标位置)? 我使用几个带有小图像的 JLayeredPanes。它们都具有相同的大小,但部分透明,因此它们创建了一个大图像,我可以在其中更改其中的单个部分。 我的问题也将得到解决,如果我能够获得单个 JLayeredPane 的颜色(我的鼠标位置),分别可以检查它是否透明。
您可以创建任何组件的 BufferedImage
。一旦你有了 BufferedImage
,你就可以使用 getRGB(…)
方法来获取像素的颜色。
创建任何组件的 BufferedImage
的最简单方法是使用 Screen Image class。您可以创建框架的图像、框架上的任何组件或组件的任何矩形区域。
在下面的示例中,右侧的标签是不可见组件的图像。当您在左侧的空白标签周围移动鼠标时,背景将更改为指示不可见组件上像素的颜色:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.event.*;
public class InvisibleImage extends JPanel
{
public InvisibleImage()
{
setLayout( new GridLayout(0, 2) );
JLabel invisible = new JLabel( new ImageIcon("mickeyred.jpg") );
invisible.setVisible( false );
BufferedImage image = ScreenImage.createImage( invisible );
JLabel panel = new JLabel();
panel.setOpaque( true );
add(panel);
JLabel label = new JLabel( new ImageIcon( image ) );
add(label);
panel.addMouseMotionListener( new MouseMotionAdapter()
{
@Override
public void mouseMoved(MouseEvent e)
{
int pixelColor = image.getRGB(e.getX(), e.getY());
Color color = new Color( pixelColor );
panel.setText( color.toString() );
panel.setBackground( color );
}
});
}
private static void createAndShowGUI()
{
JFrame frame = new JFrame("InvisibleImage");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new InvisibleImage() );
frame.pack();
frame.setLocationByPlatform( true );
frame.setVisible( true );
}
public static void main(String[] args) throws Exception
{
java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
}
}
如果您不想使用 ScreenImage
class 那么您可以使用以下方法创建 BufferedImage:
invisible.setSize( invisible.getPreferredSize() );
Dimension d = invisible.getSize();
BufferedImage image = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
invisible.print( g2d );
g2d.dispose();