Android > 앨범에서 이미지 선택후 Crop 후 Imageview 에 띄우기
등록일 : 2017-07-06 17:53
조회수 : 93,813
Gallery 혹은 Album 에서부터 Image를 Crop 하며 Pick 하는 방법에 대한 Sample Code 를 제공한다.
설명은 주석을 참고하기 바랍니다.
public class WriteActivity extends Activity implements OnClickListener{
private static final int PICK_FROM_ALBUM = 1; //앨범 선택
private static final String TYPE_IMAGE = "image/*";
private static final int PROFILE_IMAGE_ASPECT_X = 1;
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 = 600;
private static final String TEMP_FILE_NAME = "tempFile.jpg";
private ImageView mPhotoImageView;
private Uri mTempImageUri;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wirte);
Button btn = (Button) findViewById(R.id.btn_send);
btn.setOnClickListener(this);
Button album_btn = (Button) findViewById(R.id.btn_album);
album_btn.setOnClickListener(this);
Button camera_btn = (Button) findViewById(R.id.btn_camera);
camera_btn.setOnClickListener(this);
mPhotoImageView = (ImageView) findViewById(R.id.img_imageview);
}
public void onClick(View v) {
if (v.getId() == R.id.btn_send) {
//전송버튼을 눌렀을때 발생한다.
} else if (v.getId() == R.id.btn_album) {
//앨범버튼 눌렀을때 이벤트 발생
doAlbumCrop();
} else if (v.getId() == R.id.btn_camera) {
//카메라 버튼 눌렀을때 이벤트 발생
}
}
private File getTempFile(){
File file = new File( Environment.getExternalStorageDirectory(), TEMP_FILE_NAME );
try{
file.createNewFile();
}
catch( Exception e ){
Log.e("cklee", "fileCreation fail" );
}
return file;
}
private Uri getJustTakenPictureUri(){
Cursor cursor = getContentResolver().query( Images.Media.EXTERNAL_CONTENT_URI,
new String[]{ Images.ImageColumns.DATA }, null, null, null );
if ( cursor == null ) return null;
String fileName = null;
if ( cursor.moveToLast())
fileName = cursor.getString(0 );
cursor.close();
if ( TextUtils.isEmpty( fileName ) ) return null;
return Uri.fromFile( new File( fileName ) );
}
//앨범 사진 크롭하는 부분
private void doAlbumCrop(){
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, PICK_FROM_ALBUM );
}
//이미지뷰에 선택한 파일을 출력합니다.
private void doImageView(){
File tempFile = getTempFile();
if ( tempFile.exists() )
((ImageView)findViewById( R.id.img_imageview )).setImageBitmap( BitmapFactory.decodeFile( tempFile.toString()));
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case PICK_FROM_ALBUM: {
doImageView();
}
}
}
}
Crop 하여 받을 사진의 용량이 적은 경우에는 return-data 라는 extra 를 넣어서 bitmap 형태로 바로 받을 수 있다.
하지만 android bundle 자체의 용량 제한때문에 용량이 큰 경우에는 IBinder 어쩌구 저쩌구 하면서 에러가 발생한다.
따라서 큰 용량의 image를 crop하는 경우는 crop 을 하면서 그것을 바로 파일로 저장하고,
그것을 onActivityResult 에서 다시 읽어주는 방식으로 해결한다.
전체 프로젝트 파일 첨부합니다.
test_join.zip