본문 바로가기
Development/Android

[안드로이드][JNI] JNI 활용하여 C언어로 흑백이미지 만들기

by 푸민 2015. 10. 29.
반응형


안녕하세요 푸민입니다.

JNI 에서는 기본 변수 타입은 크게 바뀌는 것이 없이 사용할수 있습니다. 하지만 배열을 사용하려면 꽤 많은 변경이 되어야 합니다.


1. 반환 타입 및 파라미터 타입을 설장한다.


jintArray Java_com_example_renderscripttest_MainActivity_colorGrayArray(JNIEnv* env, jobject thiz,         jintArray pixels){

...

}


위와 같이 jintArray 라는 타입의 Array 를 반환타입과 파라미터 타입으로 설정합니다.



2. 작업후 반환할 변수를 생성한다.


int r, g, b, graypixel, n, i;

jintArray gray;

jint pixel;


n = env->GetArrayLength(pixels);

gray = env->NewIntArray(n);


위를 보면 int 타입이 있고 jint 타입이 있습니다. int 타입은 해당 C파일 내부에서만 사용하기 때문에 굳이 jint 타입으로 정의할 필요가 없습니다. 그리고 gray 라는 변수를 반환하려고 하기에 입력받은 jintArray 과 같은 크기로 생성해줍니다.



3. 흑백 이미지 작업


for(i = 0 ; i < n ; i++){

env->GetIntArrayRegion(pixels, i, 1, &pixel); //pixel에 pixels[i]값을 대입

r = (pixel >> 16) & 0xFF; //int pixel의 r 부분 추출

g = (pixel >> 8) & 0xFF ;//int pixel의 g 부분 추출

b = pixel & 0xFF; //int pixel의 b 부분 추출


r = g = b = (int)(r * 0.229 + g * 0.587 + b * 0.114); //회색으로 변환


graypixel = (0xFF000000 | (r << 16) | (g << 8) | b); //하나의 int 타입으로 합쳐줌


env->SetIntArrayRegion(gray, i, 1, &graypixel); // gray[i]에 값을 대입

}


픽셀 크기 만큼 반복문을 통해서 각 픽셀들의 r, g, b 값을 추출하여 gray 계산식을 사용해서 바꿔줍니다.



4. 이미지 데이터(jintArray)를 반환한다.


return gray;




소스 입니다.


int r, g, b, graypixel, n, i;

jintArray gray;

jint pixel;


//jniArray 라는 반환값을 가진다.

// 파라미터로 jintArray 라는 변수를 받는다.

jintArray Java_com_example_renderscripttest_MainActivity_colorGrayArray(JNIEnv* env, jobject thiz, jintArray pixels){

n = env->GetArrayLength(pixels);// 사이즈를 구하는 함수이다. C++ 문법에 맞게 작성되어있다.

gray = env->NewIntArray(n);//jintArray 타입 생성


for(i = 0 ; i < n ; i++){

env->GetIntArrayRegion(pixels, i, 1, &pixel);//pixel에 pixels[i]값을 대입

r = (pixel >> 16) & 0xFF;//int pixel의 r 부분 추출

g = (pixel >> 8) & 0xFF;//int pixel의 g 부분 추출

b = pixel & 0xFF;//int pixel의 b 부분 추출


r = g = b = (int)(r * 0.229 + g * 0.587 + b * 0.114);//회색으로 변환


graypixel = (0xFF000000 | (r << 16) | (g << 8) | b);//하나의 int 타입으로 합쳐줌


env->SetIntArrayRegion(gray, i, 1, &graypixel);// gray[i]에 값을 대입

}

return gray;//반환

}


반응형

댓글