(1) Bitmap in Android
안드로이드에서 Bitmap 클래스는 android.graphics.Bitmap에 있음.
Bitmap은 Bitmap.compressFormat에 JPEG, PNG, WEBP를 지원하며, Bitmap.Config에서 ALPHA_8, ARGB_4444, ARGB_8888, 그리고 RGB_565 타입을 지원함.
ALPHA_8은 alpha 채널 하나에 데이터를 저장하고,
자주 쓰이는 ARGB_8888은 각각의 픽셀은 4byte=32bit에 저장됨. 따라서 RGB 각각 8 bit, 그리고 Alpha값 8bit로 저장됨
그리고 RGB_565는 RGB값만을 2byte=16bit로 저장함. 이때, R은 5bit, G는 6bit, B는 5bit임. 그래서 565임
Bitmap에서 Raw Data는 getPixels함수를 통해 int[] 형태로 얻어낼 수 있음. 그리고 얻어낸 pixel에 대해, RGB 및 Alpha 값은 다음과 같은 간단한 코드로 가져올 수 있음. 즉, ARGB_8888은 총 32비트 중 앞에서 순서대로 각 8비트 씩, Alpha (default는 ff), R, G, B로 저장되어 있음.
// Get R, G, B from pixels int R= (pixels[i] >> 16) & 0xff; int G= (pixels[i] >> 8) & 0xff; int B= pixels[i] & 0xff; // Get pixel value from R, G, B (assumes Alpha is ff) int newPixels[]=ff*0x1000000 + R*0x10000 + G*0xff + B;
참고로 Android에서 int형 및 float형은 32비트이며, char은 16비트 unicode, byte는 8비트임
그리고 위와 같이 복잡하게 할 것 없이, Android는 android.graphics.Color 클래스에서 color 값에서 R, G, B를 구하거나, R, G, B에서 color 값을 구하는 함수를 제공하고 있으며, HSV와 RGB간의 변환을 제공함
RGBm YUV, HSV에 대해선 카페 링크와 블로그 참조
(2) Mat in OpenCV for Android
Computer Vision에서 널리 쓰이는 OpenCV도 Android로 포팅되어 있기에, Computer Vision 관련 알고리즘이 필요할 때 유용하게 사용할 수 있음.
OpenCV에선 IPL Image 클래스 뿐만 아니라 Mat 클래스도 이미지 정보를 담기 위해 많이 사용됨. 참고로, IplImage는 OpenCV 초창기부터 사용되었던 구조체로, alloc, dealloc을 수동으로 해줘야 되는 불편함이 있기에, C++ 버젼부터 Mat 클래스를 제공함.
OpenCV for Android의 Mat 클래스는 Android의 ARGB_8888에 대응하여 CV_8UC4를 많이 사용함.
이때 8bit로 4개의 channel을 표현하므로, 이를 Java Array로 담을때는 byte[] 형을 사용해야 함.
그리고 각 채널은 순서대로 R, G, B, Alpha 정보를 담고 있음.
즉, Alpha 정보가 저장된 순서가 맨앞 (Android Bitmap)이냐? 뒤 (OpenCV for Android의 Mat) 냐? 라는 차이가 있음.
No comments:
Post a Comment