본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] Gallery 로부터 사진 Crop 하며 Pick 하기 sample code.

by 돼지왕 왕돼지 2013. 8. 3.
반응형


 안드로이드, 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 에서 다시 읽어주는 방식으로 해결한다.






반응형

댓글