2015-10-20 72 views
0

我看到以上链接为上述查询,但两个答案不符合预期。如何捕获带叠加层的相机预览屏幕截图?

[How to programmatically take a screenshot in Android?

后市展望:捕捉相机预览与覆盖。

+0

所以你想捕捉照片预览中显示的照片? – vishnus

+2

使用标准API将相机中的图像捕获到位图中。为位图创建一个画布,然后用该画布绘制覆盖图。保存位图。如果这不适合你,你需要更详细地解释你的要求。 – fadden

回答

2

我向民间提供了解决方案,请check this answer。他无法得到结果,但复制下面的代码是一年前我在生产中使用的代码。请尝试。

该代码捕获SurfaceView中的图像,该图像来自Camera。你可以覆盖它的一些意见。它们将与Camera预览一起捕获。

public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback { 
    private static final String TAG = "CameraSurfaceView"; 

    private SurfaceHolder mSurfaceHolder; 
    private Camera mCamera = null; 
    private Bitmap mBitmap; 
    private Context mContext; 
    private Camera.Parameters mParameters; 
    private byte[] byteArray; 
    private List<Camera.Size> mSupportedPreviewSizes; 
    private Camera.Size mPreviewSize; 

    public CameraSurfaceView (Context context) { 
     this(context, null); 
    } 

    public CameraSurfaceView (Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public CameraSurfaceView (Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     mContext = context; 

     try { 
      mSurfaceHolder = getHolder(); 
      mSurfaceHolder.addCallback(this); 
      mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

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

    @Override 
    public void surfaceCreated(final SurfaceHolder surfaceHolder) { 
     if (mCamera == null) { 
      try { 
       mCamera = Camera.open(); 
      } catch (RuntimeException ignored) { 
      } 
     } 

     try { 
      if (mCamera != null) { 
       WindowManager winManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); 
       mCamera.setPreviewDisplay(mSurfaceHolder); 
      } 
     } catch (Exception e) { 
      if (mCamera != null) 
       mCamera.release(); 
      mCamera = null; 
     } 

     if (mCamera == null) { 
       return; 
     } else { 
      mCamera.setPreviewCallback(new Camera.PreviewCallback() { 
       @Override 
       public void onPreviewFrame(byte[] bytes, Camera camera) { 
        if (mParameters == null) 
        { 
         return; 
        } 
        byteArray = bytes; 
       } 
      }); 
     } 

     setWillNotDraw(false); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) { 
     try { 
      mParameters = mCamera.getParameters(); 

      List<Size> cameraSize = mParameters.getSupportedPreviewSizes(); 
      mPreviewSize = cameraSize.get(0); 

      for (Size s : cameraSize) { 
       if ((s.width * s.height) > (mPreviewSize.width * mPreviewSize.height)) { 
        mPreviewSize = s; 
       } 
      } 

      mParameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
      mCamera.setParameters(mParameters); 
      mCamera.startPreview(); 

     } catch (Exception e) { 
      if (mCamera != null) { 
       mCamera.release(); 
       mCamera = null; 
      } 
     } 
    } 


    @Override 
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
     if (mCamera != null) { 
      mCamera.setPreviewCallback(null); 
      mCamera.stopPreview(); 
      mCamera.release(); 
      mCamera = null; 
     } 
    } 

    public Bitmap getBitmap() { 
     try { 
      if (mParameters == null) 
       return null; 

      if (mPreviewSize == null) 
       return null; 

      int format = mParameters.getPreviewFormat(); 
      YuvImage yuvImage = new YuvImage(byteArray, format, mPreviewSize.width, mPreviewSize.height, null); 
      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 

      Rect rect = new Rect(0, 0, mPreviewSize.width, mPreviewSize.height); 

      yuvImage.compressToJpeg(rect, 75, byteArrayOutputStream); 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inPurgeable = true; 
      options.inInputShareable = true; 
      mBitmap = BitmapFactory.decodeByteArray(byteArrayOutputStream.toByteArray(), 0, byteArrayOutputStream.size(), options); 

      byteArrayOutputStream.flush(); 
      byteArrayOutputStream.close(); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 

     return mBitmap; 
    } 

    public Camera getCamera() { 
     return mCamera; 
    } 
} 
+0

你好,你可以提供完整的代码实现有一些错误不能在这个类中解决 –