Java图形反转颜色合成

时间:2014-03-10 01:26:37

标签: java graphics colors composite invert

基本上我想做的是为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();
}

1 个答案:

答案 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有一些针对该算法的解决方案,但我没有亲自尝试过看到它们的效果。