이전편에서 언급한 Bitmap를 재사용하려면 사용하지 않는 비트맵을 담아 둘 Pool이 필요하게 된다. 이번편에서는 이 풀(pool)을 만들어 보기로 하겠다. 원리는 간단하다. 사용하지 않는 Bitmap을 리스트에 넣어두고 이미지를 로드할 때, 크기가 맞는 녀석을 골라서 다시 내어주면 된다. 약간의 효율을 위해 리스트는 Bitmap의 ByteSize를 기준으로 정렬을 해두도록 한다. 멤버변수들 다음은 만들 클래스의 멤버변수들과 컨스트럭터이다. public class SimpleLruBitmapPool { private static final String TAG = "SimpleLruBitmapPool"; // Pool에 들어올수 있는 최대 크기 private int mMaxByteSize; // 현재 비..
여기서의 재사용은 recycle을 말하는 것이 아니고,이미 존재하는 Bitmap변수에 이미지를 가지고 오는 방법을 설명한다. BitmapFactory.decode* 함수들을 이용할 때, 이미 메모리상에 존재하는 Bitmap에 이미지를 로드할 수 있다. 이렇게 하면 다음과 같은 장점이 존재하게 된다. 장점 비트맵메모리를 필요한 만큼 할당이 되어 있다면, 할당/해제 과정이 사라지게되고, 이로인해 GC에 의해 순간순간 멈추는 현상이 줄어들게 된다. 이미 존재하는 Bitmap을 이용하기 때문에 OOM이 현저히 줄어들게 된다. 단점 사용되지 않는 비트맵을 recycle하지 않고, 계속할당되어있기 때문에, 필요없는 메모리 사용량이 존재하기 된다. 재사용할 비트맵을 유지관리하는 코드가 추가 되어야 한다. 지금부터 설..
동작방식 색변경을 위해 안드로이드에서 제공하는 행렬(Matrix)는 5x4로 다음과 같이 생겼다. [ a b c d e f g h i j k l m n o p q r s t ] 이 행렬을 수식으로 나타내면 다음과 같이 된다. R' = a*R + b*G + c*B + d*A + e G' = f*R + g*G + h*B + i*A + j B' = k*R + l*G + m*B + n*A + o A' = p*R + q*G + r*B + s*A + t 행렬이 나왔다고 해서 겁먹을 필요는 없다. 이 수식을 천천히 살펴보자. 맨 오른쪽의 (e, j, o, t)값은 앞부분의 곱하기 연산과 관련 없이 그냥 더하고/빼는 값일 뿐이다. RGBA값을 강제로 끌어 올리거나 내리는 용도로 사용되는 값이다. R' 값은 원본의 R,..
안드로이드에서 이미지를 다룰 때, ImageView내에 어떻게 그려낼 지를 미리 정의해 둔 것이 있다. 실제 일일이 코딩으로 계산하며 만드는 시간을 줄여 주는 고마운 방식이다. 안드로이드 버전이 올라가면서 추가 될 수도 있겠지만, 총 8가지 방식이 있으며, 필요한 상황에 맞춰 바로 사용하면 된다. 하지만 정확한 동작방식을 일일이 테스트해보기는 시간이 걸리는 작업이니, 이 곳에 그 내용을 정리하도록 한다. 표로 정리를 해보았다. 표의 [XML]컬럼은 xml layout의 속성값이다. (android:scaleType="여기") 표의 [이미지 비율]컬럼은 가로/세로의 비율을 말한다. Java ScaleType.* 값 XML 크기변경 비율 설명 MATRIX 0 matrix 지맘대로 지맘 setImageMatr..
Android YV12[Kor,한글] Android NDK Access memory of Bitmap directly YV12 Structure YV12 has separeted planes of Y, U and V. Y demension is identical to image, U and V plane has demension of half of image width and height. Colors of pixels are composed like next. 4Y share 1 UV. YV21 6x4 image(not considering of padding) [Y00][Y01][Y02][Y03][Y04][Y05] [Y06][Y07][Y08][Y09][Y10][Y11] [Y12][Y13][Y14][Y..
YV12 구조 안드로이드에서 사용하는 YV12는 YUV각각의 Plane이 다 분리되어 있고, U와 V Plane은 폭과 높이가 모두 이미지 크기의 반이다. 픽셀의 색은 다음과 같이 배경색의 조합으로 구성된다. YV21 6x4 이미지(padding을 고려안함) [Y00][Y01][Y02][Y03][Y04][Y05] [Y06][Y07][Y08][Y09][Y10][Y11] [Y12][Y13][Y14][Y15][Y16][Y17] [Y18][Y19][Y20][Y21][Y22][Y23] + [V0][V1][V2] [V2][V3][V2] + [U0][U1][U2] [U2][U3][U2] YV12 STRIDE NV21은 stride값을 계산할 필요없이 모든 픽셀이 붙어있어, padding이 전혀없다. 하지만 YV12는..
To access bitmap(android.graphics.Bitmap) pixels, getPixel/setPixel/setPixels/getPixels of Bitmap can be used. but, this operation is too slow, Android NDK support to access memory of bitmap directly. By this method can access memory directly, You can use other C graphic library such as gd and so on and This is very fast. Usage include file is and send "-ljnigraphics" to linker to link this libr..
Bitmap(android.graphics.Bitmap)의 픽셀단위로 처리하고 싶은 경우 getPixel/setPixel/setPixels/getPixels를 이용해야 한다. 하지만 이 처리는 java로 처리하기에는 속도가 너무 느리다. Android NDK에서는 이 처리를 위해 비트맵의 메모리에 직접 접근할 수 있는 방법을 제공하고 있다. 메모리에 직접접근이 가능하기 때문에, C로 미리 만들어진 그래픽라이브러리도 바로 사용이 가능한 장점이 있으며, 무엇보다도 빠른 속도로 처리할 수 있다. 사용법은 다음과 같다. header파일은 를 include하고 library는 jnigraphics다. 링커에게 "-lJnigraphics"를 전달해 주면 된다. 다음의 코드는 CMakeLists.txt파일을 이용할 ..
그리 어려운 개념은 아니지만, image의 stride는 늘 나를 괴롭힌다. image를 다룰 때마다 신경을 안 쓸 수가 없는 부분이며, 정확히 명시되어있지 않는 상황에서는 일일이 테스트를 거쳐 파악을 해야할 경우도 다반사다. stride는 이미지의 한 줄(row)의 크기를 나타내는 것으로 이미지의 width와는 다른 개념이다. 이미지를 메모리든 파일이든 저장된 형태를 결정짓는 부분이다. 한 픽셀이 RGB 3바이트로 구성된 이미지를 예를 들어 보자. 이미지의 크기가 3x3으로 가정하고 다음의 구조를 보자. RGB RGB RGB PPP RGB RGB RGB PPP RGB RGB RGB PPP P : padding 위의 이미지는 width값은 3[RGB]*3[byte per pixel]이지만, stride값..
- Total
- Today
- Yesterday
- 재태크
- choreographer
- 텍스처
- OpenGL ES
- 사용료
- 컴퓨트쉐이더
- 전기세
- texture
- TTS
- 애드센스
- 애드핏
- ComputeShader
- 티스토리
- 예금
- 경제보복
- 적금
- 금리
- 컴퓨트셰이더
- 아끼는 법
- 에어컨
- Android
- 에어콘
- OpenGLes
- 안드로이드
- 전기료
- 블로그
- 전기요금
- 공유 컨텍스트
- gpgpu
- 재테크
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |