【发布时间】: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