在Android中的画布上绘制变换后的位图时性能缓慢

问题描述

我正在尝试进一步处理Camera2图像。由于设备中的摄像头具有不同的旋转角度,并且会根据前后摄像头的角度进行翻转,因此我使用了变换来正确旋转它。 transformationMatrix是前置摄像头具有270旋转的矩阵。

然后从转换后的相机图像中,我想将滚动窗口复制到另一个位图。我想保留该位图/状态并在电话屏幕上绘制finalBitmapWithScanner之前画一条线。

有没有一种方法可以更有效,更快速地做到这一点? second line需要200毫秒才能完成,这是这里的主要问题。

   Canvas canvas = new Canvas(tempBitmap);
   canvas.drawBitmap(cameraBitmap,transformationMatrix,paint); // <=  200ms 
   Rect src = new Rect((int) lastXPos,(int) mXPos,mViewHeight);
   Canvas canvas2 = new Canvas(finalBitmap);
   canvas2.drawBitmap(tempBitmap,src,paint);
   Canvas canvas3 = new Canvas(finalBitmapWithScanner);
   canvas3.drawBitmap(finalBitmap,paint);
   canvas3.drawLine(mXPos,mXPos,mViewHeight/2,scrollerPaint);


    transformationMatrix.reset();
    transformationMatrix.setRotate(270,imageHeight,0);
    transformationMatrix.postTranslate(-imageHeight,0);
    transformationMatrix.postScale(scaleFactor,scaleFactor);
    transformationMatrix.postScale(-1f,1f,mViewWidth / 2f,mViewHeight / 2f);

解决方法

有很多方法可以尝试实现快速渲染:

  1. 您可以传递参数“paint”一个空值。
  2. 您也可以使用函数 CreateScaledBitmap 并注意您必须在渲染之前设置比例和大小,如下所示:

如您在文档中所见,请在此处输入链接描述;您必须在渲染之前调整位图的大小和缩放比例,以便您可以将以下代码用于 BitmapFactory.Options

mBitmapOptions.inScaled = true;
mBitmapOptions.inDensity = srcWidth;
mBitmapOptions.inTargetDensity =  dstWidth;

// will load & resize the image to be 1/inSampleSize dimensions
    mCurrentBitmap = BitmapFactory.decodeResources(getResources(),mImageIDs,mBitmapOptions);
  1. 在绘制函数之后使用canvas.restore()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...