加快android上的位图绘制速度

时间:2014-04-27 21:30:26

标签: android image canvas bitmap

我一直在努力绘制一个位图,然后用矩形突出显示一个区域。最初,我在绘画中使用alpha黑色绘制位图,使图像更暗,然后在区域中绘制原始位图,从而创建高光效果。我发现最大的减速是因为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));

在剪辑内的区域中,我绘制了原始位图。有用。但我对响应时间不满意。分析后,Bitmap是最长的。我已经将位图缩放到屏幕的大小,因此它绘制了300x800-ish图像。最大的资源浪费似乎是照明效果。因为当我把它关闭时,我会得到不错的响应时间。

所以我想知道我是否错过了任何改进位图绘制速度的方法,可能是缓存?或者我只是坚持这个因为我想要更暗的图像,实际上应该重新考虑“突出/选择”?为什么在2D图像中绘制带有alpha颜色的位图是如此昂贵?

2 个答案:

答案 0 :(得分:0)

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

如果是这样,那么我会使用带有方形机智draw9patch的图像并将其用作图像视图上的浮动视图

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

对不起,我不好解释自己。

答案 1 :(得分:0)

对于任何有兴趣的人,也许面临类似的问题。此解决方案适用于我的特定情况,但我有一个单独的背景位图,其中使用以下方式手动设置黑暗像素:

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的位图相比,绘制速度和响应时间快速而平滑。