从[1,0]的地图中使用透明叠加层对图像区域进行彩色的有效方法

时间:2013-11-22 11:21:19

标签: java bitmap overlay transparency jlayer

我在标题中避免使用位图作为位图,通常(?)指的是基础图像中的位图。

我有一个被分割成许多不同区域的图像。对于每个区域,我都有一个1和0的映射(位图),其中1表示区域内部,0表示区域外。并非图像的每个部分都覆盖有区域,并且区域可能重叠。图像的尺寸为(480x360)。

我想要做的是用鼠标覆盖区域时用透明的红色覆盖图像。我的问题是我当前的方法非常慢,并且在叠加层出现之前需要一两秒钟。

我目前的方法是在我的ImagePanel上使用JLayer(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之外的其他方式接受建议。我可以在某些&#34; magic&#34;中使用我的位图吗?用一些摆动法的方式?我可以将它与BufferedImage的底层位图混合使用吗?移除透明度是唯一可以帮助我的事情吗? (这是我想保留的东西)

其他两个与问题无关的问题,但我还没有解决:

  • 每次鼠标移动时都会重新绘制叠加层。这似乎是浪费资源。
  • 当区域重叠时,如何选择要绘制的区域?

0 个答案:

没有答案