안드로이드

[Android] Camera PreView 화면 캡처 및 배경 이미지 적용 (3)

코딩하는후운 2022. 10. 25. 11:24
반응형

Camera PreView 화면 캡처 및 배경 이미지 적용

이번에는 프리뷰 화면 배경에 이미지를 추가하는 법입니다.

xml에 배경이미지를 추가합니다.

<LinearLayout
    android:orientation="horizontal"
    android:background="#32000000"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="80dp">

    <ImageView
        android:id="@+id/ivFrame1"
        android:layout_marginRight="20dp"
        android:src="@drawable/frame1"
        android:scaleType="fitXY"
        android:layout_width="60dp"
        android:layout_height="60dp" />

    <ImageView
        android:id="@+id/ivFrame2"
        android:src="@drawable/frame2"
        android:layout_width="60dp"
        android:layout_height="60dp" />

</LinearLayout>



* 블로그에서 구현한 방식은 Preview화면 앞에 배경이 투명인 이미지를 추가하여 마치 배경이 있는 카메라 화면인 것처럼 만들었다.
Preview화면에 직접 오버레이 된 방식이 아니므로 캡처시 카메라이미지 + 선택한 배경 이미지를 합성했습니다.

btnTransform.setOnClickListener{
  //전면, 후면 전환시 배경 이미지를 초기화 해줍니다.
  ivFrameSet.setImageDrawable(null)
  transformCamera()
}

ivFrame1.setOnClickListener{
  ivFrameSet.setImageResource(R.drawable.frame1)
  myCameraPreview?.setFrameId(R.drawable.frame1)
}



이렇게 설정 되면
mCameraPreview의 setFrameId함수를 통해 배경 이미지를 캡처시 합성 할 수 있게 됩니다.
전면과 후면 카메라를 바꿔주는 transformCamera함수 또한 추가해 줍니다.

private fun transformCamera(){
  if(CAMERA_FACING == Camera.CameraInfo.CAMERA_FACING_FRONT){
    CAMERA_FACING = Camera.CameraInfo.CAMERA_FACING_BACK

    cameraPreview.removeAllViews()
    startCamera()
  }else{
    CAMERA_FACING = Camera.CameraInfo.CAMERA_FACING_FRONT

    cameraPreview.removeAllViews()
    startCamera()
  }
}



_MyCameraPreview.java

private int frameId = 0
적용 시킬 frameId 값을 전역 변수로 선언해 줍니다.

/**
* 이미지 캡처시 배경 선택
*/
public void setFrameId(int frameId){
  this.frameId = frameId;
}

setFrameId함수를 추가해 배경 이미지의 id값을 받아옵니다.

private Camera.PictureCallback jpegCallback = new Camera.PictureCallback(){
  public void onPictureTaken(byte[] data, Camera camera){
    ...

    /**
    * frameId가 있는 경우 해당 이미지를 합성해 준다.
    */
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();

    if(0 != frameId){
      Bitmap bp = BitmapFactory.decodeResource(getContext().getResources(), frameId);
      Bitmap resizeBp = Bitmap.createScaledBitmap(bp, width, height, true);

      Canvas canvas = new Canvas(bitmap);
      canvas.drawBitmap(resizeBp, 0f, 0f, null);
    }

    ...

    //파일로 저장
    new MyCameraPreview.SaveImageTask().execute(currentData)
  }
}


frameId가 0이 아닌 경우 해당 이미지를 bitmap변환 후 Canvas를 통해 이미지를 합성해 줍니다.

이렇게 설정하면 내가 배경으로 지정한 이미지와 함께 화면이 캡처 됩니다.

 

 

참조 :

https://black-jin0427.tistory.com/86?category=727620 

 

[Android, Camera] 3. 카메라 프리뷰를 이용한 화면 캡처 및 배경 이미지 적용

안녕하세요. 블랙진입니다. Capture the camera preview with image in android Camera api 를 사용하여 화면을 캡처하고 캡처한 화면에 배경 이미지를 적용하는 방법에 대해 포스팅 해보겠습니다. 현 포스팅은

black-jin0427.tistory.com

 

반응형