2017-07-16 85 views
1

次のコードを使用してスクリーンショットを取得しています。私はスクリーンショットを取得しますが、画像に黒い詰め物が付いています。スクリーンショットを取ったりパッドを削除したりするためにインターネットで見つかったコードサンプルは、ここで使用されています:MediaProjection APIを使用してスクリーンショットを撮るときに余分な埋め込みが発生する

// 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); 


    } 

ここに私が得ているものを示すスクリーンショットがあります。自分のアクティビティ内のImageViewにビットマップをロードしています。 enter image description here

答えて

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); 
+0

から取得したビットマップ上の別のビットマップベースを作成する必要がありますが、私は1つのビットマップを使用して、これを行うことができますか?パフォーマンスは私のアプリケーションの使用にとって非常に重要です。私は、2つのビットマップの作成に時間がかかります。 – Usman

+0

1つのビットマップを使用する方法はありません。ビットマップをImageViewに設定したい場合は、ImageWidth(幅:高さ)をmWidth/mHeight、scaleTypeをfitStartに設定します –

関連する問題