안드로이드 SurfaceView 캡쳐 예제
다음과 같은 상황이라고 가정하자.
아이템의 사진을 찍는 앱이 있는데, 이 아이템들은 ActivityScreen의 특정한 고정 된 영역에서 볼 수 있어야 한다는 요구사항 있다.
문제는 저장된 비트맵이 액티비티에 표시될 때 인데, 카메라로 보고 찍은 것과는 보여지는게 다르다. 줌을 땡겨서 사진을 찍을 때, 프리뷰 화면에서는 보여지지 않았던 영역까지 액티비티에 그려진다.
해결을 위한 주요 코드 줄은 다음과 같다.
surfHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
captImageView = (ImageView)findViewById(R.id.CamImageView);
byte [] photoData;
Camera cam;
SurfaceHolder surfHolder;
SurfaceView surfView;
Camera.PictureCallback cback;
cback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
final int length = data.length;
opts.inSampleSize = 4;
final BitmapFactory.Options opts = new BitmapFactory.Options();
Bitmap bMap = null;
try {
bMap = BitmapFactory.decodeByteArray(data, 0, length, opts);
} catch(OutOfMemoryError e) {
// OutOfMemoryError handle
} catch(Exception e) {
// Exception handle
}
captImageView.setImageBitmap(bitmap);
if(bMap==null) {
cam.startPreview();
} else {
savePhotoButton.setVisibility(ImageView.VISIBLE);
takePhotoButton.setVisibility(ImageView.INVISIBLE);
photoData = data;
}
}
}
이미지 저장 (IMAGE SAVE)
captImageView.setImageBitmap(null);
// SAVE THE PICTURE THIS SAVES PICTURE IN WRONG SIZE. LOOKS LIKED ZOOMED IN NOT WHAT WAS PREVIEWED!!!
public void photoSave(byte[] data) {
final int length = data.length;
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
try {
Bitmap bMap = BitmapFactory.decodeByteArray(data, 0, length, options);
int quality = 75;
File file = new File(getDir(), fname);
fileOutputStream = new FileOutputStream(file);
bMap.compress(CompressFormat.JPEG, quality, fileOutputStream);
} catch(FileNotFoundException e) {
// Handle FileNotFoundException
} catch(OutOfMemoryError e) {
// Handle OutOfMemoryError
}
}
액티비티에 이미지 보이기(IMAGE DISPLAY as DRAWABLE in ACTIVITY)
사진이 찍히면 언제나 미리보기에서 보이지 않는 확대 또는 축소 된 부분으로 이미지가 표시되곤 했었다.
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = inSampSize;
Bitmap bitmap = BitmapFactory.decodeFile(path, options);
Drawable drawable = bitmap;
ImageView pictureView = (ImageView)findViewById(R.id.pictureViewer);
pictureView.setImageDrawable(drawable);
'개발자의 기록 노트 > Android' 카테고리의 다른 글
[안드로이드] 안드로이드에서 SQLite를 다뤄보자 (2) (0) | 2011.08.09 |
---|---|
[안드로이드] 안드로이드에서 SQLite를 다뤄보자 (1) (1) | 2011.08.09 |
[안드로이드]Error generating final archive: Debug certificate expired on (0) | 2011.08.06 |
[Android] 죽지않는 서비스 만들기 (0) | 2011.06.22 |
[안드로이드] Push Notification 구현 (0) | 2011.06.22 |
[안드로이드] 커스텀 프로그레스바 (0) | 2011.06.22 |