0

考虑所有意见截图我有以下布局安卓上显示

  • SurfaceHolder
  • SurfaceView
  • CameraPreview
  • 视图(傻眼镜)

所有的工具软件我想要做的就是拍摄这张照片/快照并对其进行调查,似乎是疯狂的/复杂的

我第一次拍了SurfaceView的快照并得到了一个黑色方块,看起来这种方法不正确

现在我正在使用MediaProjection/ImageReader?

更新:所以我得到一个图像,但波浪线和崩溃,因为我试图停止MediaProjection。至于说,所有我想要做的是采取单一的图片

private void saveImage() 
    { 
     final Handler mHandler = new Handler(); 

     final ImageReader mImageReader = ImageReader.newInstance(cameraSurface.getWidth(), cameraSurface.getHeight(), PixelFormat.RGBA_8888, 2); 
     mProjection.createVirtualDisplay("screen-mirror", cameraSurface.getWidth(), cameraSurface.getHeight(), mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), null, null); 

     mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { 
      @Override 
      public void onImageAvailable(ImageReader reader) { 
       Image image = null; 
       FileOutputStream fos = null; 
       Bitmap bitmap = null; 

       try { 
        image = mImageReader.acquireLatestImage(); 
        fos = new FileOutputStream(Environment.getExternalStorageDirectory().toString() + "/myscreen.jpg"); 
        final Image.Plane[] planes = image.getPlanes(); 
        final Buffer buffer = planes[0].getBuffer().rewind(); 
        bitmap = Bitmap.createBitmap(cameraSurface.getWidth(), cameraSurface.getHeight(), Bitmap.Config.ARGB_8888); 
        bitmap.copyPixelsFromBuffer(buffer); 
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos); 

        //MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "Title" , "Desc"); 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } finally { 
        if (fos!=null) { 
         try { 
          fos.close(); 
         } catch (IOException ioe) { 
          ioe.printStackTrace(); 
         } 
        } 

        if (bitmap!=null) 
         bitmap.recycle(); 

        if (image!=null) 
         image.close(); 

        if (mProjection!=null) { 
         mProjection.stop(); 
         mImageReader.close(); 

        } 
       } 
      } 

     }, mHandler); 
    } 

回答

2

你配置你的ImageReader为ImageFormat.RGB_565,这是格式为0x4。虚拟显示器以格式0x1,PixelFormat.RGBA_8888返回帧。 (是的,有两种重叠的颜色格式定义。)配置不匹配,因此错误。

更改您的ImageReader创建线以改为使用RGBA_8888格式。

当您尝试创建位图时,您将遇到另一个问题。 decodeByteArray()用于压缩数据,如PNG或JPEG。它不会知道如何解释原始像素数据。请使用类似Bitmap#createBitmap()的呼叫,并在参数Bitmap.Config中传递ARGB_8888。

(有关更多一般性评论,请参阅this answer。)