반응형
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
반응형
'안드로이드' 카테고리의 다른 글
파일다운로드 retrofit2 rxjava (0) | 2022.10.25 |
---|---|
[Android] Camera PreView 화면 캡처 및 배경 이미지 적용 (3) (0) | 2022.10.25 |
[Android] Camera PreView 화면 캡처 및 배경 이미지 적용 (1) (0) | 2022.10.25 |
[Android] 외부 스킴(Custom Url Scheme) 사용 방법 (0) | 2022.10.25 |
[Android] 안드로이드 앱 아이콘(App icon) 사이즈 (0) | 2022.10.25 |