안드로이드, Gallery 로부터 사진 Crop 하며 Pick 하기 sample code. |
Gallery 혹은 iPhone 용어로 Album 에서부터 Image ( 사진 ) 을 Crop 하며 Pick 하는 방법에 대한 Sample Code 를 제공한다.
private static final int REQUEST_CODE_PROFILE_IMAGE_PICK = 545;
private static final String TYPE_IMAGE = "image/*";
private static final int PROFILE_IMAGE_ASPECT_X = 3;
private static final int PROFILE_IMAGE_ASPECT_Y = 1;
private static final int PROFILE_IMAGE_OUTPUT_X = 600;
private static final int PROFILE_IMAGE_OUTPUT_Y = 200;
private static final String TEMP_FILE_NAME = "profileImageTemp.jpg";
private Uri mTempImageUri;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTempImageUri = Uri.fromFile( getTempFile() );
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType( TYPE_IMAGE );
intent.putExtra( "crop", "true" );
intent.putExtra( "aspectX", PROFILE_IMAGE_ASPECT_X );
intent.putExtra( "aspectY", PROFILE_IMAGE_ASPECT_Y );
intent.putExtra( "outputX", PROFILE_IMAGE_OUTPUT_X );
intent.putExtra( "outputY", PROFILE_IMAGE_OUTPUT_Y);
intent.putExtra( "scale", true );
intent.putExtra( MediaStore.EXTRA_OUTPUT, mTempImageUri );
intent.putExtra( "outputFormat", Bitmap.CompressFormat.JPEG.toString() );
startActivityForResult( intent, REQUEST_CODE_PROFILE_IMAGE_PICK );
}
private File getTempFile(){
File file = new File( Environment.getExternalStorageDirectory(), TEMP_FILE_NAME );
try{
file.createNewFile();
}
catch( Exception e ){
Log.e("kingpig", "fileCreation fail" );
}
return file;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_CODE_PROFILE_IMAGE_PICK:
File tempFile = getTempFile();
if ( tempFile.exists() )
((ImageView)findViewById( R.id.img )).setImageBitmap( BitmapFactory.decodeFile( tempFile.toString() ) );
}
}
왜 파일에 저장해서 처리하는가?
Crop 하여 받을 사진의 용량이 적은 경우에는 return-data 라는 extra 를 넣어서 bitmap 형태로 바로 받을 수 있다. 하지만 android bundle 자체의 용량 제한때문에 용량이 큰 경우에는 IBinder 어쩌구 저쩌구 하면서 에러가 발생한다. 따라서 큰 용량( 큰 사이즈 ) 로 image를 crop하는 경우는 crop 을 하면서 그것을 바로 파일로 저장하고, 그것을 onActivityResult 에서 다시 읽어주는 방식으로 해결한다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] extrernal image file path <-> MediaStore Uri ( conversion ) (0) | 2013.08.05 |
---|---|
[android] camera take and crop ( 사진 찍으면서 crop 까지 하기 ) (2) | 2013.08.05 |
[android] adb 명령어로 clear data ( 데이타 지우기 ) (1) | 2013.08.03 |
[android] viewstub 이건 뭐하는 녀석이야?? (0) | 2013.08.02 |
[android] PendingIntent flag 의 의미 (0) | 2013.08.02 |
댓글