안드로이드

[Android] Camera Preview를 화면 캡처 및 배경 이미지 적용 (2)

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

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

1.캡처 기능 추가
_activity_main.xml
캡처 버튼을 추가해 줍니다.

btnCapture.setOnClickListener{
  myCameraPreview?.takePicture()
}


캡처 버튼에 takePicture()함수를 적용해 줍니다.


_MyCameraPreview.java

/**
* 이미지 캡처
*/
public void takePicture(){
  mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);
}

/**
* 이미지 저장을 위한 콜백 함수
*/
private Camera.ShutterCallback shutterCalback = new Camera.ShutterCallback(){
  public void onShutter(){

  }
};

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

  }
}

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

    //이미지의 너비와 높이 결정
    int w = camera.getParameters().getPictureSize().width;
    int h = camera.getParameters().getPictureSize().height;
    int orientation = calculatePreviewOrientation(mCameraInfo, mDisplayOrientation);

    //byte array 를 bitmap으로 변환
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPrefferedConfig = Bitmap.Config.ARGB_8888;
    Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options);

    //이미지를 디바이스 방향으로 회전
    Matrix matrix = new Matrix();

    /**
    * 셀카 모드에는 저장 시 좌우 반전을 해줘야 한다.
    */
    if(mCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){
      //180도 추가 회전 후 좌우반전을 해줍니다.
      //orientation += 180;
      matrix.setScale(-1,1);
    }

    matrix.postRotate(orientation);
    bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);

    //bitmap 을 byte array로 변환
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    byte[] currentData = stream.toByteArray();

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



위와 같이 takePicture와 콜백 함수를 추가해 줍니다.
jpegCallback 함수를 통해 비트맵 이미지를 바이트 변환하여 JPEG이미지로 정하게 됩니다.
그 하단에 이어서 SaveImageTask클래스를 추가해 줍니다.

/**
* 이미지 저장을 위한 콜백 클래스
*/
private class SaveImageTask extends AsyncTask<byte[], Void, Void>{
  @Override
  protected Void doInBackground(byte[]... data){
    FileOutputStream outStream = null;

    try{
      File path = new file(Environment.getExternalStorageDirectory().getAbsolutePath() + "/camtest");
      if(!path.exists()){
        path.mkdirs();
      }

      String filename = String.format("%d.jpg", System.currentTimeMillis());
      File outputFile = new File(path, fileName);

      outStream = new FileOutputStream(outputFile);
      outStream.write(data[0]);
      outStream.flush();
      outStream.close();

      Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length + " to "
                    + outputFile.getAbsolutePath());

      mCamera.startPreview();

      //갤러리에 반영
      Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
      mediaScanIntent.setData(Uri.fromFile(outputFile));
      getContext().sendBroadcast(mediaScanIntent);

      try{
        mCamera.setPreviewDisplay(mHolder);
        mCamera.startPreview();
      }catch(Exception e){

      }
    }catch(FileNotFoundException e){
      e.printStackTrace();
    }catch(IOException e){
      e.printStackTrace();
    }

    return null;
  }
}


위 클래스는 AsyncTask로 동작합니다.

Environment.getExternalStorageDirectory().getAbsolutePath() + "/camtest"

위는 갤러리에 저장될 파일 경로입니다. camtest라는 폴더가 생성되어 그 안에 사진이 차곡차곡 정리됩니다.

String filename = String.format("%d.jpeg", System.currentTimeMillis());
위는 camtest 폴더에 저장되는 파일명입니다. 파일 타입은 jpg이고 파일명은 중복되면 안되기 때문에
시스템 시간으로 설정하였습니다.

 

 

참조 :

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

 

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

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

black-jin0427.tistory.com

 

반응형