안드로이드에서 단말기 내부의 사진을 ImageView 등에 출력할 때,
이미지가 가로 방향인지 세로 방향인지 체크해서 적절하게 회전시켜서 보여주는 함수입니다.
이미지의 Orientation 정보를 얻는 함수입니다.
01.
public
synchronized
static
int
GetExifOrientation(String filepath)
02.
{
03.
int
degree = 0;
04.
ExifInterface exif =
null
;
05.
06.
try
07.
{
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.
try
08.
{
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.
try
06.
{
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 size
16.
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.
}