Java 在Android中使用canvas旋转性能不佳的图形
我在使用画布旋转图片时遇到性能问题。 在我的项目中,我需要使用mediaprojection从imageReader捕获屏幕帧缓冲区, 我需要设置图像旋转,所以我使用canvas和setmatrix来旋转它,但这需要很长的延迟 有更好的方法吗 这是我的密码Java 在Android中使用canvas旋转性能不佳的图形,java,android,performance,opengl-es,Java,Android,Performance,Opengl Es,我在使用画布旋转图片时遇到性能问题。 在我的项目中,我需要使用mediaprojection从imageReader捕获屏幕帧缓冲区, 我需要设置图像旋转,所以我使用canvas和setmatrix来旋转它,但这需要很长的延迟 有更好的方法吗 这是我的密码 mMediaProjection = mMediaProjectionManager.getMediaProjection(mResultCode, mResultData); mImgReader = Im
mMediaProjection = mMediaProjectionManager.getMediaProjection(mResultCode, mResultData);
mImgReader = ImageReader.newInstance(mWidth, mHeight, PixelFormat.RGBA_8888, 1);
mImgReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image img = null;
try {
img = reader.acquireLatestImage();
if (img != null) {
Image.Plane[] planes = img.getPlanes();
if (planes[0].getBuffer() == null) {
img.close();
return;
}
int width = img.getWidth();
int height = img.getHeight();
int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int pitch = rowStride / pixelStride;
ByteBuffer buffer = planes[0].getBuffer().order(ByteOrder.BIG_ENDIAN);
int d=0;
if (mRotate == 1)d = 90;
else if (mRotate == 3) d =270;
else if (mRotate == 2) d =180;
if(mRotate != 0)
{
int rowPadding = rowStride - pixelStride * width;
ByteBuffer buffer2 = ByteBuffer.allocateDirect(mHeight2*mWidth2*4);
Bitmap bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(buffer);
if(d==90) {
float xScale = (float) mWidth2 / width;
float yScale = (float) mHeight2 / height;
float scale = Math.max(xScale, yScale);
Bitmap dest = Bitmap.createBitmap(mHeight2, mWidth2, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(dest);
Matrix matrix = new Matrix();
matrix.setRotate(d);
matrix.postScale(scale, scale);
matrix.postTranslate(mHeight2, 0);
canvas.drawBitmap(bitmap, matrix, null);
dest.copyPixelsToBuffer(buffer2);
outputbuffer1(buffer2, dest.getWidth(), dest.getHeight(), dest.getWidth());
}else if (d == 270)
{
float xScale = (float) mWidth2 / width;
float yScale = (float) mHeight2 / height;
float scale = Math.max(xScale, yScale);
Bitmap dest = Bitmap.createBitmap(mHeight2, mWidth2, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(dest);
Matrix matrix = new Matrix();
matrix.setRotate(d);
matrix.postScale(scale, scale);
matrix.postTranslate(0, mWidth2);
canvas.drawBitmap(bitmap, matrix, null);
dest.copyPixelsToBuffer(buffer2);
outputbuffer1(buffer2, dest.getWidth(), dest.getHeight(), dest.getWidth());
}else
{
float xScale = (float) mWidth2 / width;
float yScale = (float) mHeight2 / height;
float scale = Math.max(xScale, yScale);
Bitmap dest = Bitmap.createBitmap(mWidth2, mHeight2, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(dest);
Matrix matrix = new Matrix();
matrix.setRotate(d);
matrix.postScale(scale, scale);
matrix.postTranslate(mWidth2, mHeight2);
canvas.drawBitmap(bitmap, matrix, null);
dest.copyPixelsToBuffer(buffer2);
outputbuffer1(buffer2, dest.getWidth(), dest.getHeight(), dest.getWidth());
}
}else {
outputbuffer1(buffer, width, height, pitch);
}
img.close();
img = null;
buffer.clear();
// reader.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != img) {
img.close();
// reader.close();
}
}
}
}, null);
//
// // Get Surface from ImageReader
mSurface = mImgReader.getSurface();
}