MediaProjection产生扭曲的屏幕截图

时间:2016-01-29 19:00:23

标签: android android-screen android-mediaprojection

我设法获得截图,但结果是这样的:

Screenshot produced

原件:

Original

这是我从几个来源获取的代码:

final ImageReader ir = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 2);
  VirtualDisplay vd= mediaProjection.createVirtualDisplay("screen", width, height, dpi, 
  DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC, ir.getSurface(), null, null);

final String path=getActivity().getFilesDir().getAbsolutePath()+"/myscreen.jpg";
  ir.setOnImageAvailableListener(new OnImageAvailableListener() {

          //  @Override
            public void onImageAvailable(ImageReader reader) {
                Image image = null;
                FileOutputStream fos = null;
                Bitmap bitmap = null;

                try {
                    image = ir.acquireLatestImage();
                    fos = new FileOutputStream( path);
                    final Image.Plane[] planes = image.getPlanes();
                    final Buffer buffer = planes[0].getBuffer().rewind();
                    bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
                    bitmap.copyPixelsFromBuffer(buffer);
                    bitmap.compress(CompressFormat.JPEG, 85, fos);
                    image.close();

                } catch (Exception e) {
                    e.printStackTrace();
             ........
             ........

2 个答案:

答案 0 :(得分:0)

您的位图的宽度和高度是关闭的 - 至少您的扭曲图像看起来就像我看到的那样。以下是我如何运作的。

int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride * imageReader.getWidth();
bitmap = Bitmap.createBitmap(imageReader.getWidth() + rowPadding / pixelStride,
                        imageReader.getHeight(), Bitmap.Config.ARGB_8888);

使用imageReaders宽度/高度(不是图像)非常重要。

创建imageReader / virtualDisplay对象时,我使用以下方法获取显示指标。

   public static DisplayMetrics getScreenMetrics(Context context) {
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

        Display display = wm.getDefaultDisplay();
        DisplayMetrics dm = new DisplayMetrics();
        display.getMetrics(dm);

        return dm;
    }

...
ImageReader imageReader = ImageReader.newInstance(displayMetrics.widthPixels, displayMetrics.heightPixels, PixelFormat.RGBA_8888, 2);

我从反复试验中得知了这一点,所以我为无法解释原因而道歉。

答案 1 :(得分:-1)

我正在使用Xamarin(.NET)并且最终能够正常工作,除了一个问题(java代码):

final ImageReader ir = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 2);

PixelFormat.RGBA_8888不是有效参数,因为ImageReader需要ImageFormatType。以下.NET代码解决了这个问题:

_mImageReader = ImageReader.NewInstance(_mWidth, _mHeight, (ImageFormatType)Format.Rgba8888, 2);

注意下面的转换,格式为Android.Graphics.Format枚举:

  

(ImageFormatType)Format.Rgba8888

我希望这可以帮助那些使用Xamarin的人,因为这在最后一天引起了很多挫折!