안드로이드에서 단말기 내부의 사진을 ImageView 등에 출력할 때,
이미지가 가로 방향인지 세로 방향인지 체크해서 적절하게 회전시켜서 보여주는 함수입니다.
이미지의 Orientation 정보를 얻는 함수입니다.
01.public synchronized static int GetExifOrientation(String filepath) 02.{03. int degree = 0;04. ExifInterface exif = null;05. 06. try07. {08. exif = new ExifInterface(filepath);09. } 10. catch (IOException e) 11. {12. Log.e(TAG, "cannot read exif");13. e.printStackTrace();14. }15. 16. if (exif != null) 17. {18. int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);19. 20. if (orientation != -1) 21. {22. // We only recognize a subset of orientation tag values.23. switch(orientation) 24. {25. case ExifInterface.ORIENTATION_ROTATE_90:26. degree = 90;27. break;28. 29. case ExifInterface.ORIENTATION_ROTATE_180:30. degree = 180;31. break;32. 33. case ExifInterface.ORIENTATION_ROTATE_270:34. degree = 270;35. break;36. }37. 38. }39. }40. 41. return degree;42.}
이미지를 특정 각도로 회전하는 함수입니다.
01.public synchronized static Bitmap GetRotatedBitmap(Bitmap bitmap, int degrees) 02.{03. if ( degrees != 0 && bitmap != null ) 04. {05. Matrix m = new Matrix();06. m.setRotate(degrees, (float) bitmap.getWidth() / 2, (float) bitmap.getHeight() / 2 );07. try08. {09. Bitmap b2 = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true);10. if (bitmap != b2) 11. {12. bitmap.recycle();13. bitmap = b2;14. }15. } 16. catch (OutOfMemoryError ex) 17. {18. // We have no memory to rotate. Return the original bitmap.19. }20. }21. 22. return bitmap;23.}
이미지를 불러오는 함수입니다.
01.public synchronized static Bitmap SafeDecodeBitmapFile(String strFilePath)02.{03. DEBUG.SHOW_DEBUG(TAG, "[ImageDownloader] SafeDecodeBitmapFile : " + strFilePath);04. 05. try06. {07. File file = new File(strFilePath);08. if (file.exists() == false)09. {10. DEBUG.SHOW_ERROR(TAG, "[ImageDownloader] SafeDecodeBitmapFile : File does not exist !!");11. 12. return null;13. }14. 15. // Max image size16. final int IMAGE_MAX_SIZE = GlobalConstants.getMaxImagePixelSize(); 17. BitmapFactory.Options bfo = new BitmapFactory.Options();18. bfo.inJustDecodeBounds = true;19. 20. BitmapFactory.decodeFile(strFilePath, bfo);21. 22. if(bfo.outHeight * bfo.outWidth >= IMAGE_MAX_SIZE * IMAGE_MAX_SIZE)23. {24. bfo.inSampleSize = (int)Math.pow(2, (int)Math.round(Math.log(IMAGE_MAX_SIZE 25. / (double) Math.max(bfo.outHeight, bfo.outWidth)) / Math.log(0.5)));26. }27. bfo.inJustDecodeBounds = false;28. bfo.inPurgeable = true;29. bfo.inDither = true;30. 31. final Bitmap bitmap = BitmapFactory.decodeFile(strFilePath, bfo);32. 33. int degree = GetExifOrientation(strFilePath);34. 35. return GetRotatedBitmap(bitmap, degree);36. }37. catch(OutOfMemoryError ex)38. {39. ex.printStackTrace();40. 41. return null;42. }43.}