정상에서 IT를 외치다

[Android,GetImage] 카메라와 갤러리에서 이미지 가져오기 (크롭 기능 추가) 본문

안드로이드

[Android,GetImage] 카메라와 갤러리에서 이미지 가져오기 (크롭 기능 추가)

Black-Jin 2018. 10. 23. 13:47
반응형

안녕하세요. 블랙진입니다.!!


카메라와 갤러리에서 이미지 가져오기를 단계별로 포스팅을 진행하고 있습니다.


1. 카메라와 갤러리에서 이미지 가져오기

2. Nougat(Android OS 7) 대응하기

3. 카메라회전 각도를 고려한 이미지 가져오기

4. 가져온 이미지 크롭(Crop) 하기


이전 포스팅에 이어 크롭 기능을 추가해 보겠습니다. 


Chapter 4. 가져온 이미지 크롭하기



안드로이드 기기 내부에는 크롭 기능을 탑재하고 있습니다.


Intent intent = new Intent("com.android.camera.action.CROP");


인텐트를 통해 크롭을 사용하실 수 있습니다. 하지만! 일부 안드로이드 기기에서는 위 크롭 인텐트가 적용이 안되는 것을 확인할 수 있었습니다. ㅠㅜ

보다 많은 개발자분들에게 도움이 되기 위해, 저는 모든 기기에 적용 수 있는 크롭 라이브러리를 사용하여 포스팅을 진행하겠습니다.


혹시 탑재되어 있는 크롭을 사용하고 싶으신 분은 이 링크를 참고해서 작업해 주세요



1. App 단계의 build.gradle 에 Crop 라이브러리를 추가해 줍니다.


app/ build.gradle

//crop
implementation 'com.soundcloud.android:android-crop:1.0.1@aar'



2. AndroidManifest 에 CropImageActivity 를 추가해 줍니다.


AndroidManifest.xml

<!-- crop activity -->
<activity
android:name="com.soundcloud.android.crop.CropImageActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.NoActionBar" />

<application> .. </application> 사이에 추가해 줍니다.



3. onActivityResult 에서 크롭 로직을 추가해 줍니다.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK) {
Toast.makeText(this, "취소 되었습니다.", Toast.LENGTH_SHORT).show();

if(tempFile != null) {
if (tempFile.exists()) {

if (tempFile.delete()) {
Log.e(TAG, tempFile.getAbsolutePath() + " 삭제 성공");
tempFile = null;
}
}
}

return;
}

switch (requestCode) {
case PICK_FROM_ALBUM: {

Uri photoUri = data.getData();
              
cropImage(photoUri);

break;
}
case PICK_FROM_CAMERA: {

Uri photoUri = Uri.fromFile(tempFile);

cropImage(photoUri);

break;
}
case Crop.REQUEST_CROP: {

setImage();
}
}
}

requestCode 에서 Crop.REQUEST_CROP 단계를 추가해 줍니다. 



4. 카메라 및 갤러리에서 가져온 이미지를 Crop 화면으로 보내줍니다.

private void cropImage(Uri photoUri) {

Log.d(TAG, "tempFile : " + tempFile);

/**
* 갤러리에서 선택한 경우에는 tempFile 이 없으므로 새로 생성해줍니다.
*/
if(tempFile == null) {
try {
tempFile = createImageFile();
} catch (IOException e) {
Toast.makeText(this, "이미지 처리 오류! 다시 시도해주세요.", Toast.LENGTH_SHORT).show();
finish();
e.printStackTrace();
}
}

//크롭 후 저장할 Uri
Uri savingUri = Uri.fromFile(tempFile);

Crop.of(photoUri, savingUri).asSquare().start(this);
}

사진촬영의 경우에는 tempFile 이 생성되어 있어 크롭된 이미지를 tempFile 에 넣어 저장할 수 있습니다. 하지만 갤러리에서 가져온 이미지는 크롭 후의 이미지를 저장할 파일이 없기 때문에 tempFile = createImageFIle() 을 추가로 작성해 주어야 합니다.



5. Crop 된 이미지 받기

case Crop.REQUEST_CROP: {

setImage();
}

크롭 후에는 onActivityResult 에서 Crop.REQUEST_CROP를 수행하게 됩니다. 우리는 위 4번에서 tempFile 에 크롭한 이미지를 이미 저장 했기 때문에 별다른 로직 없이 tempFile 를 크롭한 이미지라 생각하고 사용하시면 됩니다.


case Crop.REQUEST_CROP: {
File cropFile = new File(Crop.getOutput(data).getPath());
}

참고로 Crop.REQUEST_CROP 에서  크롭한 파일을 가져오는 방법은 위와 같습니다.


자! 이렇게 카메라와 갤러이에서 이미지 가져오기 포스팅을 모두 끝냈습니다. 따라오시면서 어려운 점이나 이해 안가는부분은 댓글로 질문 부탁드리겠습니다. 혹은 코드에서 잘못된 점이 있거나 더 좋은 방식이 있다면 얼마든지 댓글 달아 주시면 감사하겠습니다. 


제 나름대로 안드로이드 OS 와  기기 별 모두 호환될 수 있게 작성을 해봤습니다. 많은 개발자 분들에게 도움이 되었으면 좋겠습니다. :)


Capter4. 깃허브



관련 포스팅


1.  카메라와 갤러리에서 이미지 가져오기

2. Nougat(Android OS 7) 대응하기

3. 카메라회전 각도를 고려한 이미지 가져오기

4. 가져온 이미지 크롭(Crop) 하기

반응형
Comments