Java 在Android中使用canvas旋转性能不佳的图形

Java 在Android中使用canvas旋转性能不佳的图形,java,android,performance,opengl-es,Java,Android,Performance,Opengl Es,我在使用画布旋转图片时遇到性能问题。 在我的项目中,我需要使用mediaprojection从imageReader捕获屏幕帧缓冲区, 我需要设置图像旋转,所以我使用canvas和setmatrix来旋转它,但这需要很长的延迟 有更好的方法吗 这是我的密码 mMediaProjection = mMediaProjectionManager.getMediaProjection(mResultCode, mResultData); mImgReader = Im

我在使用画布旋转图片时遇到性能问题。 在我的项目中,我需要使用mediaprojection从imageReader捕获屏幕帧缓冲区, 我需要设置图像旋转,所以我使用canvas和setmatrix来旋转它,但这需要很长的延迟

有更好的方法吗

这是我的密码

        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();
    }