관리 메뉴

정상에서 IT를 외치다

[Android,GetImage] 카메라와 갤러리에서 이미지 가져오기 (카메라 회전각도 적용) 본문

안드로이드

[Android,GetImage] 카메라와 갤러리에서 이미지 가져오기 (카메라 회전각도 적용)

Black-Jin 2018. 10. 23. 13:09
728x90
반응형

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


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


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

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

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

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


이전 포스팅에 이어 카메라 회전 각도에 맞춰 이미지 가져오는 법을 포스팅 하겠습니다.


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


이슈


안드로이드 기종에 따라 카메라 회전각도가 달라 촬영한 이미지의 방향이 다를 경우가 발생


해결방안


카메라 회전 각도를 가져와 이미지를 변형해 줍니다.



0. Package



1. ImageResizeUtils 기능


ImageResizeUtils.class 는 2가지 기능을 가지고 있습니다.


첫번째. 이미지의 사이즈를 커스텀마이징 할 수 있습니다.


두번째. 카메라 촬영일 경우 회전 각도를 가져와 이미지를 회전시킵니다.


그럼 ImageResizeUtils 에 대해 살펴보겠습니다.

public class ImageResizeUtils {

public static void resizeFile(File file, File newFile, int newWidth, Boolean isCamera) {

//...
}
}

위와 같이 4개의 변수를 받아옵니다.


1). FIle 

- 내가 변형시키고 싶은 파일


2). newFile 

- 변형시킨 파일을 저장할 파일


3). newWidth

 - 리사이징 할 크기 (이미지의 가로와 세로를 비교해서 더 긴쪽의 사이즈를 newWidth 값으로 변형해줍니다.)


4). isCamera

 - 카메라에서 온 이미지인 경우 회전각도를 반영



위와 같은 4가지 변수를 가지고 있습니다. 

아래는 ImageResizeUtils 의 전체 코드입니다. 자세한 설명은 주석을 보시면 충분히 이해하실 수 있을 겁니다.




2. 프로젝트에 적용하기


전역변수에 isCamera 를 선언 해줍니다.

private Boolean isCamera = false;

이는 이미지를 리사이징 하는 단계에서 카메라에서 온 화면인지 앨범에서 온 화면인지 구분할 용도입니다.


private void goToAlbum() {
isCamera = false;
...
}

private void takePhoto() {
isCamera = true;
...
}

goToAlbum, takePhoto 함수에서 isCamera 의 변수를 설정해 줍니다. 


private void setImage() {

ImageView imageView = findViewById(R.id.imageVeiew);

ImageResizeUtils.resizeFile(tempFile, tempFile, 1280, isCamera);

BitmapFactory.Options options = new BitmapFactory.Options();
Bitmap originalBm = BitmapFactory.decodeFile(tempFile.getAbsolutePath(), options);
Log.d(TAG, "setImage : " + tempFile.getAbsolutePath());

imageView.setImageBitmap(originalBm);

}

setImage 단계에서 최종 파일인 tempFile을 리사이징 해줍니다.

ImageResizeUtils.resizeFile(tempFile, tempFile, 1280, isCamera);

첫 번째 파라미터에 변형시킬 tempFile 을 넣었습니다.

두 번째 파라미터에는 변형시킨 파일을 다시 tempFile에 저장해 줍니다.

세 번째 파라미터는 이미지의 긴 부분을 1280 사이즈로 리사이징 하라는 의미입니다.

네 번째 파라미터를 통해 카메라에서 가져온 이미지인 경우 카메라의 회전각도를 적용해 줍니다.(앨범에서 가져온 경우에는 회전각도를 적용 시킬 필요가 없겠죠?)


Chapter3. 깃허브



관련 포스팅


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

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

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

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

반응형
6 Comments
  • 프로필사진 jj 2019.02.13 22:05 안녕하세요 예제 잘봤습니다! out of memory 상황에서는 회전을 시키지 못하고 원본을 반환한다고 하는데 out of memory를 해결하고 bitmap을 회전시킬 수 있는 방법이 무엇이 있는지 궁금합니다!
  • 프로필사진 Black-Jin 2019.02.14 00:21 신고 1. AndroidManifest에 android:largeHeap="true" 설정을 추가해 힙을 늘려주어 OOM을 예방할 수 있습니다.

    2. 사이즈가 큰 비트맵을 사용하기 때문에 OOM에 빠지게 됩니다. DownSampling을 통해 비트맵 사이즈를 줄여 보면 어떨까 싶습니다.

    직접 테스트 해본건 아니라 잘 될지는 모르겠습니다:)
    혹시 더 좋은 방법이 있다면 공유 부탁드리겠습니다. 감사합니다.

    <참고링크>
    https://stackoverflow.com/questions/24795761/how-to-display-large-size-bitmaps-in-imageview-android
  • 프로필사진 hw00173 2019.05.29 22:25 안녕하세요. 예제를 통해서 구현 중인 학생입니다.!

    다름이 아니라 찍은 사진이 저장은 되는데 갤러리에선 조회가 되지 않고, 핸드폰 내파일 경로를 타고 들어가서야만 확인이 되는데, 이 경우 어떤식으로 해야되는지 알고 싶습니다.! 추가적으로 기존 다른 사진과 비교했을 경우에 차이점은 찍은 시간인데 해당 예제를 따라서 사진을 찍을 경우 찍은 시간이 모두 2003년 7월 24일 오전 4시36분으로 동일합니다.!!
  • 프로필사진 Black-Jin 2019.05.31 14:00 신고 안녕하세요.
    찍은 사진이 갤러리에 바로 보이지 않는 경우 sendBroadcast를 통해 강제로 업데이트해주세요.

    >> context.sendBroadcast(new Intent( Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));

    찍은 사진이 2003년 7월 24일 오전 4시36분으로 동일한 점은 추후 더 알아보겠습니다. 혹시 먼저 발견하시면 답글 부탁드립니다 :)

    감사합니다.
  • 프로필사진 hw00173 2019.05.31 21:41 댓글 달아주셔서 감사합니다.!! 하지만 비밀댓글을
    볼 수가 없어서 비밀댓글 풀어주시면 감사하겠습니다.!
  • 프로필사진 Black-Jin 2019.06.01 01:02 신고 앗! 몰랐습니다 :)
댓글쓰기 폼