在android上加速位图绘制



我一直在努力绘制位图,然后用矩形突出显示上面的区域。最初,我用阿尔法黑绘制了一个位图,使图像更暗,然后在顶部绘制一个区域的原始位图,创建高光效果。我发现最大的减速是因为Paint中的alpha。所以我重新编写了代码,并在我的绘制线程中得到了以下内容:

private synchronized void drawSquare(int xStart, int yStart, int xEnd, int yEnd) {
  Canvas c = holder.lockCanvas();
  if(c != null) {
        // Draw the background picture on top with some changed alpha channel to blend
        Paint paint = new Paint();
        paint.setAntiAlias(true);

        if(bg != null && cWidth > 0 && cHeight > 0) {
            c.clipRect(xStart, yStart, xEnd, yEnd,  Region.Op.DIFFERENCE);
            c.drawBitmap(bg, gTransform, blackSqr); // Draw derker background
            c.clipRect(xStart, yStart, xEnd, yEnd, Region.Op.REPLACE);
            c.drawBitmap(bg, gTransform, paint); ///draw original in selection
            c.clipRect(0, 0, cWidth, cHeight,Region.Op.REPLACE);
        }
        Matrix RTcorner = new Matrix();
        RTcorner.setRotate(90);
        RTcorner.postTranslate(xEnd + 13, yStart - 13);
        Matrix RBcorner = new Matrix();
        RBcorner.setRotate(180);
        RBcorner.postTranslate(xEnd + 13, yEnd + 13);
        Matrix LBcorner = new Matrix();
        LBcorner.setRotate(270);
        LBcorner.postTranslate(xStart - 13, yEnd + 13);
        // Draw the fancy bounding box 
        c.drawRect(xStart, yStart, xEnd, yEnd, linePaintB);
        // Draw corners for the fancy box
        c.drawBitmap(corner, xStart - 13, yStart - 13, new Paint());    
        c.drawBitmap(corner, RBcorner, new Paint());        
        c.drawBitmap(corner, LBcorner, new Paint());    
        c.drawBitmap(corner, RTcorner, new Paint());

    }
    holder.unlockCanvasAndPost(c);
}

所以这个剪辑出了我的选择区域,我用有这个代码的油漆画出来,使它更暗。

blackSqr.setColorFilter(new LightingColorFilter(Color.rgb(100,100,100),0));

在剪辑内部的区域中,我绘制了原始位图。它有效。但我对响应时间不满意。分析后位图是需要最长时间的。我已经将位图缩放到屏幕的大小,所以它绘制的是300x800 ish的图像。最大的资源消耗似乎是灯光效果。因为当我关闭它时,我会得到相当好的响应时间。

所以我想知道我是否遗漏了一些改进位图绘制速度的地方,也许是缓存?还是我只是因为想要更暗的图像而坚持这样做,实际上应该完全重新思考"突出显示/选择"?为什么在2D图像中绘制具有alpha颜色的位图如此昂贵?

如果我理解你想要什么,你想要一个矩形(带圆角)来突出显示另一个图像中的一个部分。

如果是这样的话,那么我会使用带有draw9补丁的正方形图像,并将其用作图像视图上的浮动视图

RelativeLaoyut(图像容器)+-ImageView(您的实际图像)+-视图(它有一个正方形作为背景,你只需要把它移动到你想突出显示的区域)

对不起,我不善于解释自己。

对于任何感兴趣的人,可能面临类似的问题。这个解决方案适用于我的特定情况,但我有一个单独的背景位图,带有使用手动设置的深色像素

for(int i = 0; i < cWidth; i++){
        for(int j = 0; j < cHeight; j++){
            int c = bg2.getPixel(i, j);
            float mult = 0.15f;
            int r = (int) (Color.red(c) * mult);
            int g = (int) (Color.green(c) * mult);
            int b = (int) (Color.blue(c) * mult);
            bg2.setPixel(i, j, Color.rgb(r, g, b));
        }
    }

然后使用bg2绘制所选剪辑矩形的主要部分和原始部分(未变暗)。创建和维护第二个位图会有一些开销,但与使用alpha的位图相比,绘制速度和响应时间快速而平滑。

最新更新