Эффективный способ окраски областей изображения с прозрачным наложением с карты [1,0]

Я избегал слова растрового изображения в заголовке, поскольку растровое изображение в этом контексте обычно (?) Относится к растровому изображению из базового изображения.

У меня есть изображение, которое разделено на несколько разных регионов. Для каждого региона у меня есть карта единиц и нулей (растровое изображение), где 1 представляет внутри области, а ноль за пределами области. Не каждая часть изображения покрыта областью, и области могут перекрываться. Изображения имеют размер (480x360).

Что я хотел бы сделать, так это наложить прозрачное красное изображение, когда вы наводите область мышью. Моя проблема в том, что мой текущий метод очень медленный, и наложение на секунду занимает одну или две секунды.

Мой текущий подход заключается в использовании JLayer поверх моей ImagePanel (расширение JPanel для рисования BufferedImage). Затем мой экземпляр LayerUI рисует наложение при перемещении мыши:

public class ImageHighlightLayerUI extends LayerUI<JPanel> {
    private boolean mouseActive;
    private Point mousePoint;
    private byte[][][] masks;

    public void paint(Graphics g, JComponent c) {
        super.paint(g, c);

        if (mouseActive) {
            byte[][] curMask = null;

            // Find which region the mouse intersect
            for (int i = 0; i < masks.length; i++) {
                if (masks[i][mousePoint.x][mousePoint.y] == 1) {
                    curMask = masks[i];
                    break;
                }
            }

            // Outside region --> don't draw overlay
            if (curMask == null) return;

            //Transparent red
            g.setColor(new Color((float)1.0, 
                            (float)0.0, (float)0.0, (float)0.8));

            //Draw the mask
            for(int x = 0; x < curMask.length; x++) 
                for(int y = 0; y < curMask[y].length; y++) 
                    if (curMask[x][y] == 1) 
                       g.fillRect(x, y, 1, 1);

        }
    }
}

Итак, как я могу сделать это более эффективным? Я открыт для предложений, используя другие способы, чем JLayer. Могу ли я использовать свое растровое изображение каким-то "волшебным" способом с помощью метода колебания? Могу ли я смешать его с базовым растровым изображением из BufferedImage? Является ли удаление прозрачности единственной вещью, которая поможет мне? (Что я хотел бы сохранить)

Две другие побочные проблемы, которые не обязательно связаны с вопросом, но мне еще предстоит решить:

  • Оверлей перекрашивается каждый раз, когда движется мышь. Это кажется пустой тратой ресурсов.
  • Когда регионы перекрываются, как мне выбрать, какой из них рисовать?

0 ответов

Другие вопросы по тегам