안드로이드 개발 정보
(글 수 1,067)
안녕하세요.
그 후에,
다만, 위에서 받아온 사진의 경우는 원본 이미지가 아니고 썸네일정도 수준의 크기입니다.
개발자 질문란에 답변을 달았더니.. 쪽지를 주셔서 조금 더 자세히 말씀드리기 위해서 개발자 정보 공간에 글을 써봅니다.
기본적으로 카메라를 찍는 Activity를 직접 만들기 위해서는.. SurfaceView등을 이용하여 구현하여야 하지만,
이 글의 목적은 어떻게해서든 사진을 찍은 '후'에, 그 정보를 받아와 ImageView에 뿌리거나, Bitmap으로 받는 것이므로
그쪽에 초점을 두겠습니다.
버전은 2.1을 기준으로 합니다.
우선 Intent를 이용하여 내장 카메라를 불러옵니다.
저는 사진 찍기 버튼 클릭시 동작하게 해놓았으므로 OnClickListener에 구현되어있습니다.
private OnClickListener photoPickClick = new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent,1); } };
그 후에,
onActivityResult를 통하여 받아옵니다.
protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if(resultCode!=0){ if(requestCode==1&&!data.equals(null)){ try{ profileBitmap = (Bitmap)data.getExtras().get("data"); profileView.setImageBitmap(profileBitmap); profileView.setScaleType(ImageView.ScaleType.FIT_XY); } catch(Exception e){ return; } } } }
당연히 profileBitmap에는 비트맵으로 사진을 받아옵니다.
저는 보통 DB에 Bitmap을 저장할때는.. Base64로 String 변환을 시켜서 합니다
일단 변환해서 DB에 저장을 하고, 나중에 단말에서 받아올때는 당연히 decode도 해줘야하구요~
일단 encode하는 부분만 기술해놓겠습니다.
ByteArrayOutputStream stream = new ByteArrayOutputStream(); profileBM.compress(CompressFormat.PNG, 100, stream); byte[] image = stream.toByteArray(); String profileImageBase64 = Base64.encodeBytes(image);
다만, 위에서 받아온 사진의 경우는 원본 이미지가 아니고 썸네일정도 수준의 크기입니다.
만약 더 큰 사진을 원하시면, 사진을 찍은 후에 일단 저장하고 불러오시거나
Intent를 만들때, EXTRA_OUT를 줘서 URI에 담아오는 방법이 있는데..
이 방법은 단말마다 멋대로 동작한다는 이야기가 있습니다 -_-;
(샘플링을 4로해서 1/4품질로 넘어오기때문에 단말마다 해상도가 자기 멋대로..)
private OnClickListener photoPickClick = new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File file = new File(Environment.getExternalStorageDirectory(), "picture.jpg" cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); startActivityForResult(cameraIntent,1); } };
위에서 getExternalStorageDirectory()로 받아왔는데, SD카드 내에 절대 경로로 지정해주셔도 상관없구요.
onActivityResult에서 profileBitmap = (Bitmap)data.getExtras().get(MediaStore.EXTRA_OUTPUT);
로 받아오시면 되겠습니다.
2010.10.04 17:37:31
감사합니다 위와 같이 소스를 짜고 사진찍고 imageview에 불러오니 화질이 엄청 안좋아지더군요ㅜ.ㅜ
그래서 intent 밑에
File file =
그래서 intent 밑에
File file =
new
File(Environment.getExternalStorageDirectory(),
"picture.jpg");
이걸 써주고 다시 실행하니까 불러올때 에러가 나는데ㅜ.ㅜ
2010.10.04 20:24:09
단영님 하나 질문 드릴께요
File file = new
File(Environment.getExternalStorageDirectory(),
"picture.jpg");
이렇게 사용하게 되면 파일명이 picture.jpg로 고정이 되버려서 사진찍고 나서 찍은 사진을 볼때 picture.jpg가 아닌 파일은 못불러오지 않나요?
제가 질문게시판에 되지 않는 코드를 올렸는데 한번 확인좀 부탁드려도 될까요?^^;;
2010.10.13 13:27:23
static final String[] IMAGE_PROJECTION = { MediaStore.Images.ImageColumns.DATA, MediaStore.Images.Thumbnails.DATA };
final Uri uriImages = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; final Uri uriImagesthum = MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI; try{ final Cursor cursorImages = cr.query(uriImages, IMAGE_PROJECTION, null, null, null); if(cursorImages != null && cursorImages.moveToLast()){ szDateTop = cursorImages.getString(0); cursorImages.close(); } }catch(Exception e){}
이렇게 해주면 마지막에 저장된 이미지가 szDateTop에 풀패스가 저장됩니다.
File file = new File(szDateTop); Uri uri = Uri.fromFile(file); Bitmap bm; try { bm = Images.Media.getBitmap(getContentResolver(), uri); img.setImageBitmap(bm); bm = null; } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //Bitmap 로드
요렇게 경로받아서 이미지에 뿌려주면 원본이미지가 뿌려질것 같네요.
2011.02.11 10:44:38
너무 늦은 댓글이라 보실지는 모르겠지만 써 놓겠습니다.
같은 문제로 googling하고 이 글 참고해서 이미지파일의 full path 받아 왔습니다.
하지만 문제가 있더군요.
일반사용자들은 다양해서 그냥 기본 카메라app을 사용하지 않았습니다.
찍은 후 바로 저장이 아니라 버튼을 눌러야 찍을 수 있는 카메라app도 있었습니다.
특정 action을 취해야 찍을 수 있도록 만든 카메라 app의 경우에는 onActivityResult를 override해서 받아봤자
언제 어떻게 동작할지 모르기 때문에 app이 죽습니다.
뭐 다른 방법을 찾으면 해결 할 수 있을지는 모르겠지만 (혹은 제가 너무 무지해서)
일단 이런 문제점이 있었습니다.
시간이 없어서 할 수 없이 다시 카메라촬영 샘플코드 받아서 수정해서 사용했습니다.
개발하시는 분들은 참고하시면 좋을 듯 합니다... or 해결 방법이 있다면 공유 좀 ^^
1. EXTRA_OUTPUT에 URI를 주는 방식은 단말마다 다르게 동작하는것이 맞구요...
갤S의 경우는 같은 이미지 중복 저장이 일어나며,
옵티머스Z는 섬네일이 넘어옵니다.
2. SD카드 경로 지정할때는 getExternalStorageDirectory()를 이용하시는 것을 추천합니다.
/sdcard/ 형태일때 일부 단말에서 이미지를 갤러리에서 불러올때 속도가 아주 느린 경우가 있습니다.