【问题标题】:Speeding up bitmap drawing on android加快在android上绘制位图
【发布时间】:2014-06-13 07:12:22
【问题描述】:

我一直在努力尝试绘制位图,然后用矩形突出显示其上的一个区域。最初,我在油漆中绘制带有 alpha black 的位图以使图像更暗,然后在顶部绘制原始位图在一个区域中创建高光效果。我发现最大的减速是因为 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 颜色绘制位图如此昂贵?

【问题讨论】:

    标签: android image canvas bitmap


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,我会尽快尝试 9patch。
    • 我无法启动 9patch,因为我认为您不能动态创建一个。
    • 动态指的是什么?你想要什么是动态的?
    【解决方案2】:

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

    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 的位图相比,绘制速度和响应时间更快且更流畅。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      相关资源
      最近更新 更多