Java Graphics Invert Color Composite

В основном то, что я хочу сделать, это сделать курсор для JComponent, пиксели которого отображаются как инверсия цвета, над которым они находятся. Например, возьмите мышь и наведите ее на буквы в адресе этой страницы. Если присмотреться, то пиксели курсора, находящиеся над черными пикселями буквы, становятся белыми. Я знаю, что вы можете инвертировать цвет RGB, вычитая текущие красный, зеленый и синий цвета из 255 для каждого соответствующего поля, но я не знаю, как реализовать это так, как я хочу.

Это часть базовой программы рисования, которую я делаю. JComponent, о котором я упоминал ранее, — это мой «холст», на котором вы можете рисовать с помощью различных инструментов. Я НЕ использую 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();
}

person pigi5    schedule 10.03.2014    source источник
comment
Хоть назови причину, если собираешься -1. Это совершенно правильный вопрос.   -  person pigi5    schedule 12.09.2014


Ответы (1)


Я считаю, что вы ищете фильтр изображения. Похоже, у вас уже есть все детали для него. Вашим фильтром будет изображение курсора, которое будет нарисовано поверх всего остального. Хитрость, как вы говорите, заключается в том, чтобы нарисовать каждый пиксель этого курсора так, чтобы цвет указанного пикселя был рассчитанным «противоположным» цвету пикселя в нарисованном пространстве за курсором.

Я не знаю, как лучше всего это сделать, но я знаю один способ, который вы могли бы улучшить. Нарисуйте любой фон на буферизованном изображении, а затем получите цвет пикселей, над которым будет зависать курсор, используя цветовую модель BufferedImage. Этот пример я нашел здесь из другого вопроса.

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2 = image.createGraphics();
_mainPanel.paint(g2);
image.getColorModel().getRGB(pixel);
g2.dispose();

В конечном итоге вы будете использовать это буферизованное изображение вашего фона, чтобы получить пиксели (и их цвета), которые перекрывает ваш курсор, а затем вы можете запустить некоторый алгоритм для цветов, чтобы инвертировать их в вашем курсоре, а затем перерисовать курсор с новыми цветами .

Этот вопрос имеет несколько решений для этого алгоритма, хотя я лично не пробовал их, чтобы увидеть их эффекты .

person Lucas    schedule 31.05.2014