问题描述
我正在尝试进一步处理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);
解决方法
有很多方法可以尝试实现快速渲染:
- 您可以传递参数“paint”一个空值。
- 您也可以使用函数 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);
- 在绘制函数之后使用canvas.restore()。