2015-10-20 73 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

你好,你可以提供完整的代碼實現有一些錯誤不能在這個類中解決 –