基本上我想做的是为JComponent制作一个光标,其像素显示为它们所用颜色的倒数。例如,将鼠标悬停在此页面的网址中的字母上。如果仔细观察,光标的黑色像素上的像素将变为白色。我知道你可以通过从每个相应字段中减去255的当前红色,绿色和蓝色来反转RGB颜色,但我不知道如何以我想要的方式实现它。
这是我正在制作的基本绘画程序的一部分。我之前提到的JComponent是我的“画布”,您可以使用各种工具进行绘制。我 NOT 使用java.awt.Cursor更改我的光标,因为我希望光标根据其下的内容动态更改。我正在使用的“光标”被定义为.png图像,我正在从该文件创建一个BufferedImage,然后我可以在整个组件的现有BufferedImage之上绘制。我使用MouseListener定义的点重绘此图像。
我查看了AlphaComposite,它看起来很接近我想要的东西,但没有任何关于像我想要的那样反转光标下方的颜色。请帮忙。
编辑:
所以我不得不用算法来做这件事,因为没有为此目的而内置任何东西。这里的代码有点脱离背景:
/**
* Changes the color of each pixel under the cursor shape in the image
* to the complimentary color of that pixel.
*
* @param points an array of points relative to the cursor image that
* represents each black pixel of the cursor image
* @param cP the point relative to the cursor image that is used
* as the hotSpot of the cursor
*/
public void drawCursorByPixel(ArrayList<Point> points, Point cP) {
Point mL = handler.getMouseLocation();
if (mL != null) {
for (Point p : points) {
int x = mL.x + p.x - cP.x;
int y = mL.y + p.y - cP.y;
if (x >= 0 && x < image.getWidth() && y >= 0 && y < image.getHeight()) {
image.setRGB(x, y, getCompliment(image.getRGB(x, y)));
}
}
}
}
public int getCompliment(int c) {
Color col = new Color(c);
int newR = 255 - col.getRed();
int newG = 255 - col.getGreen();
int newB = 255 - col.getBlue();
return new Color(newR, newG, newB).getRGB();
}
答案 0 :(得分:0)
我相信你要找的是图像滤镜。听起来你甚至已经为它建造了所有的碎片。您的过滤器将是光标的图像,它将被绘制在其他所有内容之上。正如你所说,诀窍是绘制光标的每个像素,使得所述像素的颜色是光标后面绘制空间中像素颜色的计算“相反”。
我不知道解决这个问题的最佳方法,但我知道一种方法可以改进。将任何背景绘制到缓冲图像,然后使用BufferedImage
的颜色模型获取光标将悬停在其上的像素的颜色。这个例子是我从另一个问题中找到的here。
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2 = image.createGraphics();
_mainPanel.paint(g2);
image.getColorModel().getRGB(pixel);
g2.dispose();
最终你将使用背景的缓冲图像来获取光标重叠的像素(及其颜色),然后你可以在颜色上运行一些算法来反转光标,然后重新绘制光标。新的颜色。
This question有一些针对该算法的解决方案,但我没有亲自尝试过看到它们的效果。