
안드로이드 Canvas에 글자를 쓰려면 우선 서체가 어떻게 생겼는지를 알아야 한다. 다행히도 안드로이드는 이 부분을 Paint class를 통하여 바로 처리할 수 있게 되어 있다. 실제 이 것을 지원해 주지 않는다면 폰트를 다루는 상황에서 상상만해도 끔찍한 일이다. 글자를 찍기위해서는 서체의 기준선들을 알아야 정확히 찍을 수가 있다. 이 기준선들은 다음과 같다. 가장 중요한 선은 baseline(세로 기준점:y)이다, 이 baseline을 기준점으로 글자는 찍히게 되며, ascent, descent, top, bottom값은 이 baseline으로 얼마나 떨어져있는 지를 나타낸다. 이 기준선들은 android.android.graphics.Paint.FontMetrics의 멤버변수들로 구성되어 있다. p..

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파일을 이용할 ..
Java는 unsigned 타입의 변수를 지원하지 않는다. 하지만 8bits의 공간만으로 처리할 수 있는 데이터는 더 큰 타입을 쓰는 것은 낭비인 것은 당연한 사실이다. 정수연산을 위해 byte와 int로 서로 변화하는 방법을 정리한다. byte(unsigned) to int byte f = 200; int t = f < 0 ? f + 256 : f; f를 t로 변환하는 데, f값은 음수값을 가지고 있다. 0을 포함한 양수면 그냥 처리하면 되지만, 음수일 경우 255을 더해서 변경해주면 된다. 하지만 이 변환루틴은 "?"연산자로 인해 많은 양의 연산이 필요한 부분에서는 속도저하를 유발한다. 다음의 방법이 훨씬 빠르고 좋다. byte f = 200; int t = f & 0xff; 참 의미 없는 코드로 보..
Detect orientation A android device has portrait and landsape orientations, usually, you could layout UI item, most thing can do by here. Add next code to do this, in AndroidMainfest.xml. android:configChanges="keyboardHidden|orientation" if android:configChanges already exists, only append orientation with "|" Override onConfigurationChanged function in your activity. public void onConfiguratio..
Orientation(방향) 알아내기 안드로이드 기기의 방향(orientation)은 Portrait(세로)과 Landscape(가로)가 있습니다. 보통 이 두가지의 방향에 따라 UI의 배치를 바꾸게 됩니다. 여기까지만 필요한 상황이면 다음의 코드로 해결할 수 있습니다. 우선 AndroidMainfest.xml파일에서 해당하는 Activity에 다음의 코드를 추가합니다. android:configChanges="keyboardHidden|orientation" 혹시나 configChanges에 다른 것이 이미 있다면, orientation만 | 를 사용하여 추가합니다. 위 한줄을 추가하는 것이 아닙니다.. 그리고 activity에 onConfigurationChanged함수를 Override합니다. pu..

ASyncTask 개요 예를들어, 안드로이드에서 리스트뷰 등을 사용할 때, 리스트뷰의 각각의 아이템마다 이미지를 그릴 경우가 많다. 이 경우 이미지를 불러와서 그려야 하는 데, 문제는 미리 메모리로 올려져있는 이미지가 아닐 경우, UI Thread에서 이미지를 로드할 경우 일반적으로 데이터크기가 큰 이미지를 처리하면 스크롤시 화면이 뚝뚝 끊기게 된다. 이미지를 저장장치에서 읽고, 이 것은 대부분 압축이 되어 있는 상태이므로 압축을 풀고 화면에 그려야 하는 데, 읽고 압축을 푸는 두 과정은 시간이 많이 드는 작업이다. 프로세서가 빨라지는 속도만큼 이미지의 크기도 커지고 화면도 해상도가 올라가기 때문에 시간이 지나 프로세서가 빨라 진다고 해도 좀처럼 이 끊김이 없어지는 걸 기대 할 수는 없는 상황이다. 이 ..
안드로이드 카메라 NV21바로 shader에서 처리하기. 안드로이드에서 Preview데이터를 받으면 NV21이라는 규격으로 받아오게 된다.물론 다른 형태도 지원하지만 필자가 테스트해본 바로는 NV21를 그냥 사용하는 것이 가장 간단하다는 결론을 내렸다. NV21을 RGB로 만드는 것에는 이미지라는 큰 데이터를 다루기에 부하가 많이 걸려 부하를 줄이기 위한 여러가지 작업을 하던 중 NV21을 바로 이용하여 처리하는 방법이 떠올랐다..(머리가 나빠졌는지 이 간단한 걸 알아내는 데 이리 오래 걸리다니..) NV21은 YPlane + VUPlane으로 구성되어 있다.이 Plane을 각각 Plane를 Texture로 만든다..(2개의 Texture를 이용한다.)여기서 VUPlane은 YPlane의 1/4크기를 갖..
동영상이나 디지털인식장치(카메라 등등)을 사용할 때, 이미지의 정보가 RGB보다는 YUV색을 쓰는 경우가 많다. 이 YUV로 표현된 형태를 Texture등으로 만들어야 할 경우 RGB 색공간으로 변환하는 작업을 해야 하는 데, 이미지라는 상당히 큰 데이터를 다루는 문제라 실제 변환작업은 영상의 frame-rate를 떨어뜨릴 정도로 부하가 걸린다.이 변환작업만으로 완성된 결과가 나오면, 상관없을 정도지만, 이 것뿐만아니라 다른 작업또한 부하가 걸리니, 이 작업의 부하를 좀 줄일 필요가 있다. 실제 카메라등에서 넘어오는 데이터는 그 들만의 형태를 가지게 되는 데, 이 것을 변환하는 작업은 2부분으로 주로 나뉜다.1 ) 처음에는 color pixel의 배치가 순서대로 되어 있지 않으므로(보통 Y-U-V가 따로..
그리 어려운 개념은 아니지만, 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값..
카메라api를 이용하여 preview를 받아오는 중에.. NV21은 모든 기기에서 지원하고, setPreviewFormat을 쓰지 않을 경우에 NV21이 기본 값이다. 하지만 필자가 가지고 있는 기기들을 살펴본 결과 YV12형식을 대부분 지원(+1)하였다. NV21은 V와 U값이 1byte씩 교차하면서 저장되어 있는 데 반해, YV12는 전체V(V-Plane)와 전체U(U-Plane)이 따로 저장이 된다. 필자는 Preview를 OpenGLES에 Texture를 만들어야 했기 때문에, NV21보다는 YV12를 사용하기로 했다.(물론 NV21를 Y와U와 V로 분리하는 코드를 넣기로 했다. ) shader에서 YUV각각의 값을 RGB로 변환하는 코드를 두고, texture의 YUV위치를 vertext sha..
구버전의 카메라Api를 사용하여 Preview를 보이게 하는 과정에서, setPreviewCallback을 사용할 경우, 지속적으로 메모리를 할당하는 방식을 쓰기 때문에, 효율을 위해 setPreviewCallbackWithBuffer를 사용할 수 밖에 없다. 실제 setPreviewCallback만 사용할 경우 메모리할당이 지속적으로 일어나며, 메모리를 해제한다고 GC의 순간 멈춤 또한 지속적으로 발생한다.GC때문에 Logcat에는 GC가 동작에 따른 로그로 가득차기 일 수 있다. 효율적인 Preview를 위해 setPreviewCallBackWithBuffer를 사용해야 하는 데, 역시 예상대로 android개발은 삽질의 연속이다. 같은 코드를 사용하여 테스트를 한다고 해도, 어떤 기기에서는 상당히 ..
안드로이드 YV12 이 문서 오류가 있으니 수정되기 전까지 보지 마세요..ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ 안드로이드의 카메라는 기본적으로 NV21방식을 쓴다 모든 안드로이드 기기의 카메라는 NV21로 촬영할 수있다. 아니면 기기에 들어갈 수 없다. 단, 구글이 정책을 바꾸면..헉~, 어찌 되건 NV21은 아마 거의 지원할 것이다. 언젠가 YUV_420_888가 기본이 될지도 모르겠다. 롤리팝부터는 YUV_420_888를 권장하기 때문에.... 필자가 테스트한 장치들의 경우 Camera Api(구버전)의 경우 NV21과 YV12를 지원하는 것으로 보였다. NV21은 다음의 구조를 가진다. 6x4픽셀크기의 이미지를 예를 들어 설명하면, 바이트순서는 다음과 같다( 16byte align stride 부분은 무시하고 보라..
안드로이드 장치에 장착된 카메라를 이용하는 프로그램을 연습 중이다.솔직히 필자의 경우 카메라를 사용할 일이 없어서 무심히 지나치던 부분인데, 일반 사용자들이 이렇게도 카메라를 이용하여 촬영을 많이 할 줄은 몰랐다.그래서 관심을 가지고 구글의 API문서를 정독을 시작했다. https://developer.android.com/guide/topics/media/camera.html : 킷캣까지.. 구글이 제공하는 일반적인 카메라 사용법https://developer.android.com/reference/android/hardware/Camera.html : 킷캣까지의 class 처음 위의 두 페이지에 들어가면 가장 눈에 띄는 것이 바로 이 문서들은 롤리팝부터는 Deprecated되었다는 것이다.글을 쓰고 ..
TextToSpeech를 이용하여 프로그래밍을 하고 있었다.TextToSpeech의 클래스를 랩핑하기 위한 작업을 위해 트래이닝에 들어갔다.전체를 Context로 묶고 시작하던 중에 난관에 부딛히고 말았다. 필자가 하고 싶었던 일은다름과 같은 static함수를 만들어 바로 소리로 출력하고 싶었다.(파일로 저장도 동일한 방법을 써야 한다.) public static function speak( Context context, String text, String utteranceId, [My Progress Callback]);이 함수는 자체적으로 TTS엔진을 초기화하고 소리로 출력을 하고 TTS엔진을 소멸하는 과정까지 한번에 처리하는 것이었다. 문제는 TextToSpeech instance를 생성하는 과정에..
TTS 설정에 관한 내용은 다음의 링크를 참고하세요. https://jamssoft.tistory.com/45 TTS 사용 / TTS 설정 #1 TTS(Text to speech)를 필자가 처음 본 것은 1989년도 였습니다. 영어만 되기 했지만, 지금 사용하는 TTS와 비교해보면, 어떻게, 그 옛날에 "어떻게 이 걸 만들어 낸 사람이 있으며, 어떻게 이 걸 만들 생각을 했.. jamssoft.tistory.com 안드로이드 TTS 프로그래밍 변경사항 : 너무 대충정리한 거라.. 올바르지 않는 부분이 많을 수 있다. API 4(DONUT) TTS지원시작 API 8(FROYO) areDefaultsEnforced : 사용자 설정을 변경하는 기능이 있었던 건 같은데.. API 13 NDK에서 지원시작.. A..
- Total
- Today
- Yesterday
- choreographer
- texture
- TTS
- 사용료
- 애드센스
- 전기세
- 에어컨
- 컴퓨트쉐이더
- 텍스처
- 금리
- OpenGLes
- 애드핏
- Android
- ComputeShader
- OpenGL ES
- 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 |