Android에서 사용하는 이미지는 Bitmap이라는 클래스에서 다~ 알아서 해줍니다. BitmapFactory는 여러가지 소스로 부터 Bitmap Object를 만들어 주는 일을 하는데, XXX에는 어떤 것으로 부터 decode를 하여
BitmapFactory.decodeByteArray() 메소드는 Camera.PictureCallback 으로
부터 받은 BitmapFactory.decodeFile() 메소드는 파일을 그대로 읽어 옵니다. BitmapFactory.decodeResource() 메소드는 Resource로 부터 Bitmap을 만들어
내며
보통 이미지 파일을 읽어서 Resizing을 해야 할 때가 있는데, 간단하게 처리 할 수 있습니다. 그런데 BitmapFactory를 사용할 때 주의해야 할 점이 있습니다.
이미지 파일로부터 Bitmap을 만든 다음에 다시 dstWidth, dstHeight 만큼 줄여서 resized 라는 Bitmap을 만들어 냈습니다. 읽어서, 줄인다. 그런데 만약 이미지 파일의 크기가 아주 크다면 어떻게 될까요? 과연 어떤 모바일 디바이스에서 얼마나 처리 할 수 있을까요? 실제로 촬영된 Jpeg 이미지를 여러번 decoding 하다보면 아래와 같은 황당한 메세지를 발견 할 수 있습니다.
네... OutOfMemory 입니다. 이것이 실제로 decoding 후 메모리 해제가 제대로 되지 않아서 그런 것인지, 하지만 메모리 에러를 피할 수 있는 방법이 있습니다.
BitmapFactory.decodeXXX 시리즈는 똑같은 메소드가 두 개씩 오버로딩 되어 있습니다. BitmapFactory.Options를 사용하게 되면 decode 할 때 여러가지 옵션을 줄 수 있습니다.
inSampleSize 옵션은, inSampleSize 옵션은 1보다 작은 값일때는 무조건 1로 세팅이 되며, 2의 지수만큼 비례할 때 가장 빠르다고 합니다. 그래서 만약 내가 줄이고자 하는 이미지가 1/4보다는 작고 1/8보다는 클 때, Bitmap.createScaledBitmap() 메소드를 사용하여 한번 더 줄이면 됩니다.
당연한 이야기 이겠지만, Bitmap.createScaledBitmap() 메소드를 쓸 필요가 없지요. inSampleSize 옵션을 잘 활용하면 메모리 부족 현상을 대략적으로 해소 할 수 있습니다.
inSampleSize 옵션을 사용하면 SkScaledBitmapSampler Object (Library Level) 를 생성 하게 되는데,
Android의 기본 어플리케이션 소스를 분석 하다보면 아 그리고 왜 dstWidth와 dstHeight 변수 선언이 없냐고 따지시는 분들 설마 없겠죠?
안드로이드 이미지 처리 할때 이미지 사이즈를 줄이거나 늘려야 될때가 있는데요 지금까지는 비트맵팩토리 등등 사용해서 귀찮았는데 간단히 사용하는 방법이 있네요 위 소스가 다입니다 createScaledBitmap 첫번째 매개변수로 읽어온 비트맵 이미지, 두번째가 width, 세번째가 height, 마지막 매개변수는 이미지가 깨지지 않도록 하는 필터 같은 역할을 합니다 이미지를 늘릴때 너무 큰 이미지를 사용할때 true로 사용하면 Out of memory 에러가 뜰수도 있다고 하니 조심하세요^^ |