【问题标题】:extra padding while taking screenshot using MediaProjection API使用 MediaProjection API 截屏时的额外填充
【发布时间】:2017-07-16 12:10:36
【问题描述】:

我正在使用以下代码来获取屏幕截图。我得到了屏幕截图,但图像上附有黑色填充。此处使用在互联网上找到的用于截屏和删除填充的代码示例:

// requesting permission
        MediaProjectionManager projectionManager = (MediaProjectionManager) getSystemService(
            Context.MEDIA_PROJECTION_SERVICE);
    startActivityForResult(projectionManager.createScreenCaptureIntent(), REQUEST_SCREENSHOT);


// requesting screenshot on successful permission (in onActivityResult)
    if (requestCode == REQUEST_SCREENSHOT && resultCode == RESULT_OK) {

        MediaProjectionManager projectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
        final MediaProjection mProjection = projectionManager.getMediaProjection(resultCode, data);


        Display mDisplay = getWindowManager().getDefaultDisplay();

        Point size = new Point();
        mDisplay.getSize(size);

        final int width = size.x;
        final int height = size.y;


        final ImageReader mImageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 2);
        mProjection.createVirtualDisplay("screen-mirror", width, height,
                getResources().getDisplayMetrics().densityDpi,
                DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY |
                        DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC, mImageReader.getSurface(),
                null, null);


        mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader imageReader) {

                final Image image = imageReader.acquireLatestImage();

                if (image != null) {
                    mImageReader.setOnImageAvailableListener(null, null);
                    mProjection.stop();

                    final Image.Plane[] planes = image.getPlanes();
                    final ByteBuffer buffer = planes[0].getBuffer();
                    int pixelStride = planes[0].getPixelStride();
                    int rowStride = planes[0].getRowStride();
                    int rowPadding = rowStride - pixelStride * width;

                    // create bitmap
                    Bitmap bmp = Bitmap.createBitmap(
                            width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888);
                    bmp.copyPixelsFromBuffer(buffer);
                    image.close();

                    ImageView iv = findViewById(R.id.iv);
                    iv.setImageBitmap(bmp);
                }
            }
        }, null);


    }

这是一个屏幕截图,显示了我得到的结果。我正在将位图加载到我的 Activity 中的 ImageView 中。

【问题讨论】:

    标签: java android screenshot android-mediaprojection


    【解决方案1】:

    首先,您得到的尺寸不正确。 你应该改为:

    WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    windowManager.getDefaultDisplay().getRealSize(size);
    

    那么你应该基于从缓冲区获得的位图创建另一个位图

    Bitmap newBitmap = Bitmap.createBitmap(bmp, 0, 0, mWidth, mHeight);
    bmp.recycle();
    ImageView iv = findViewById(R.id.iv);
    iv.setImageBitmap(newBitmap);
    

    【讨论】:

    • 这很好用,但我可以使用一张位图来做到这一点吗?性能对我的应用程序的使用至关重要,我注意到创建两个位图需要额外的时间。
    • 我认为没有办法使用一张位图。如果要将位图设置为ImageView,可以设置ImageView的比例(width:height)为mWidth/mHeight,设置scaleType为fitStart
    猜你喜欢
    • 2020-11-06
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2020-11-28
    相关资源
    最近更新 更多