안드로이드 개발 질문/답변
(글 수 45,052)
public class Capture1 extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.capture1); //적용할 레이아웃 설정
// final CameraSurfaceView cameraView = new CameraSurfaceView(getApplicationContext());
// FrameLayout frame = (FrameLayout) findViewById(R.id.frame); // 적용할 프레임
// frame.addView(cameraView); // add(프레임에 카레마 뷰 넣음)
//
final CameraSurfaceView cameraView = new CameraSurfaceView(this);
FrameLayout frame = (FrameLayout) findViewById(R.id.frame); // 적용할 프레임
frame.addView(cameraView); // add(프레임에 카레마 뷰 넣음)
//촬영 버튼 action 및 UI
Button still = (Button) findViewById(R.id.capture);// 버튼 설정.
still.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
cameraView.capture(new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
FileOutputStream fos;
try{
Log.v("Still", "OK1");//Log console 사용대신으로 안드로이드에서 사용..
fos = openFileOutput("confirm.jpg", MODE_WORLD_READABLE);
Log.v("Still", "OK2");
//Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
fos.write(data);
fos.close();
}catch(Exception e){
Log.e("Still", "Error");
}
}
});
}
});
//촬영 버튼 action 및 UI
//카메라 구동 API
private class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback{
private SurfaceHolder mHolder;
private Camera camera = null;
public CameraSurfaceView(Context context){
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 객체를 얻어서 종류를 SURFACE_....BUFFERS로 설정 //OnCREATE 에서 호출 하기 적합
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){//속성 설정후 StartPreview를 얻는다
//카메라 미리보기에 유용한 너비 높이 정보 전달 카메라에 비친 영상을 안드로이드 기기화면에서 볼수 있음.
Camera.Parameters params = camera.getParameters();
//params.set("orientation", "landscape");
//params.set("orientation", "portrait");
//params.setp
params.setPreviewSize(width, height);
//params.setRotation(180);
//params.setPictureSize(320, 240);
camera.setParameters(params);
camera.startPreview();
}
public void surfaceCreated(SurfaceHolder holder){ //카메라 인스턴스를 얻는다
//안드로이드 시스템이 사진 이미지를 표시할 준비를 메서드 실행하여 인스턴스를 마련
camera = Camera.open();
try {
camera.setPreviewDisplay(mHolder);
} catch (IOException e) {
// TODO Auto-generated catch block
camera.release(); //자원 반환으로 오류 해결.
camera = null;
e.printStackTrace();
}
}
public void surfaceDestroyed(SurfaceHolder holder){//카메라 객체를 해제 한다
camera.stopPreview();
camera = null;
}
public boolean capture(Camera.PictureCallback jpegHandler){ // 찍은 이미지를 저장을 위해 Callback 클래스 구현
//카메라가 보고있는 이미지를 촬영을 위해 takePicture메서드를 호출
if(camera != null){
camera.takePicture(null, null, jpegHandler); //takePicture 매게 변수를 설정해서 셔텨음등 촬영전 특정 작업 수행 가능
return true;
}
else{
return false;
}
}
}
//카메라 구동 API
}
===========================================================
이거 인데요...
사진 촬영하면 이미지가 해상도가 2560 x 1920-_-;;;
300X400정도면 되는데...
어케 줄여야 할까요... ㅠ_ㅠ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.capture1); //적용할 레이아웃 설정
// final CameraSurfaceView cameraView = new CameraSurfaceView(getApplicationContext());
// FrameLayout frame = (FrameLayout) findViewById(R.id.frame); // 적용할 프레임
// frame.addView(cameraView); // add(프레임에 카레마 뷰 넣음)
//
final CameraSurfaceView cameraView = new CameraSurfaceView(this);
FrameLayout frame = (FrameLayout) findViewById(R.id.frame); // 적용할 프레임
frame.addView(cameraView); // add(프레임에 카레마 뷰 넣음)
//촬영 버튼 action 및 UI
Button still = (Button) findViewById(R.id.capture);// 버튼 설정.
still.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
cameraView.capture(new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
FileOutputStream fos;
try{
Log.v("Still", "OK1");//Log console 사용대신으로 안드로이드에서 사용..
fos = openFileOutput("confirm.jpg", MODE_WORLD_READABLE);
Log.v("Still", "OK2");
//Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
fos.write(data);
fos.close();
}catch(Exception e){
Log.e("Still", "Error");
}
}
});
}
});
//촬영 버튼 action 및 UI
//카메라 구동 API
private class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback{
private SurfaceHolder mHolder;
private Camera camera = null;
public CameraSurfaceView(Context context){
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 객체를 얻어서 종류를 SURFACE_....BUFFERS로 설정 //OnCREATE 에서 호출 하기 적합
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){//속성 설정후 StartPreview를 얻는다
//카메라 미리보기에 유용한 너비 높이 정보 전달 카메라에 비친 영상을 안드로이드 기기화면에서 볼수 있음.
Camera.Parameters params = camera.getParameters();
//params.set("orientation", "landscape");
//params.set("orientation", "portrait");
//params.setp
params.setPreviewSize(width, height);
//params.setRotation(180);
//params.setPictureSize(320, 240);
camera.setParameters(params);
camera.startPreview();
}
public void surfaceCreated(SurfaceHolder holder){ //카메라 인스턴스를 얻는다
//안드로이드 시스템이 사진 이미지를 표시할 준비를 메서드 실행하여 인스턴스를 마련
camera = Camera.open();
try {
camera.setPreviewDisplay(mHolder);
} catch (IOException e) {
// TODO Auto-generated catch block
camera.release(); //자원 반환으로 오류 해결.
camera = null;
e.printStackTrace();
}
}
public void surfaceDestroyed(SurfaceHolder holder){//카메라 객체를 해제 한다
camera.stopPreview();
camera = null;
}
public boolean capture(Camera.PictureCallback jpegHandler){ // 찍은 이미지를 저장을 위해 Callback 클래스 구현
//카메라가 보고있는 이미지를 촬영을 위해 takePicture메서드를 호출
if(camera != null){
camera.takePicture(null, null, jpegHandler); //takePicture 매게 변수를 설정해서 셔텨음등 촬영전 특정 작업 수행 가능
return true;
}
else{
return false;
}
}
}
//카메라 구동 API
}
===========================================================
이거 인데요...
사진 촬영하면 이미지가 해상도가 2560 x 1920-_-;;;
300X400정도면 되는데...
어케 줄여야 할까요... ㅠ_ㅠ;
2010.11.10 15:24:49
아예 찍을 때 줄여서 찍는건 잘 모르겠는데요..찍은 이미지를 줄이는 방법은 쉬워요.
http://www.androidpub.com/945244#7 참고하시면 될꺼 같아요.
decodeFile 할 때 options 값을 넣어주시면 되요^^ㅋ
2010.11.10 15:34:20
params.setPreviewSize(width, height);
처럼
setPictureSize(int width, int height)가 있습니다.
근데 먼저 가능한 Resolution 인지 보고 세팅해 야겟죠



