안규 공부방

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 
 
※ 혹시 도움이 되셨다면 댓글에 한마디 남겨주세요!
작성자   비밀번호
자동글 방지     (자동글 방지 기능입니다.)
내용   댓글달기 
이메일 문의 : cak0280@nate.com  
Copyright 2000 By ENTERSOFT.KR All Rights Reserved.