제임스딘딘의
Tech & Life

개발자의 기록 노트/Android

[안드로이드] 안드로이드 SurfaceView 캡쳐 예제

제임스-딘딘 2011. 7. 4. 09:36

안드로이드 SurfaceView 캡쳐 예제


다음과 같은 상황이라고 가정하자.

아이템의 사진을 찍는 앱이 있는데, 이 아이템들은 ActivityScreen의 특정한 고정 된 영역에서 볼 수 있어야 한다는 요구사항 있다.
문제는 저장된 비트맵이 액티비티에 표시될 때 인데, 카메라로 보고 찍은 것과는 보여지는게 다르다. 줌을 땡겨서 사진을 찍을 때, 프리뷰 화면에서는 보여지지 않았던 영역까지 액티비티에 그려진다.

해결을 위한 주요 코드 줄은 다음과 같다.


이미지 캡쳐 (IMAGE CAPTURE)
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);