출력이 첨부한 파일처럼 나오네요...
코드는...
//java
public class MainActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyView vw = new MyView(this);
setContentView(vw);
}
protected class MyView extends View {
public MyView(Context context) {
super(context);
}
public void onDraw(Canvas canvas) {
BufferedInputStream bis ;
bis = new BufferedInputStream(this.getResources().openRawResource(R.raw.yuv422));
byte[] data = new byte[352*288*2];
try {
while(bis.read(data) != -1){}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int sz = 352*288;
int[] rgb = new int [sz];
Yuv422toRgb(rgb, data, 352, 288);
Bitmap bit = Bitmap.createBitmap(rgb, 352, 288, Config.ARGB_8888);
canvas.drawBitmap(bit, 0, 0, null);
}
}
public native void Yuv422toRgb(int[] rgb, byte[] data, int w, int h);
static {
System.loadLibrary("Yuv");
}
}
//c
#include <jni.h>
JNIEXPORT void JNICALL
Java_com_canvas_MainActivity_Yuv422toRgb(JNIEnv * env, jobject obj,
jintArray rgb, jbyteArray data, jint w, jint h) {
int y1, y2, u, v, cb, cr, r, g, b, r2, g2, b2;
int i, sz = w * h;
int tmp[sz];
jint c_rgb[sz];
jboolean isCopy;
jbyte* c_data = (*env)->GetByteArrayElements(env, data, &isCopy);
for (i = 0; i < sz; i = i + 2) {
y1 = c_data[i * 2 + 1];
y2 = c_data[i * 2 + 3];
u = c_data[i * 2];
v = c_data[i * 2 + 2];
cb = change(u);
cr = change(v);
v = v - 128;
u = u - 128;
r = 1.164 * (y1 - 16) + 1.596 * cr;
g = 1.164 * (y1 - 16) - 0.813 * cr - 0.391 * cb;
b = 1.164 * (y1 - 16) + 2.018 * cb;
r2 = 1.164 * (y2 - 16) + 1.596 * cr;
g2 = 1.164 * (y2 - 16) - 0.813 * cr - 0.391 * cb;
b2 = 1.164 * (y2 - 16) + 2.018 * cb;
c_rgb[i] = 0xff000000 + (r << 16) + (g << 8) + b;
c_rgb[i + 1] = 0xff000000 + (r2 << 16) + (g2 << 8) + b2;
}
(*env)->SetIntArrayRegion(env, rgb, 0, sz, c_rgb);
}
void convert(int i) {
if (i > 255)
i = 255;
}
int change(int uv) {
if (uv < 128)
uv + 128;
else
uv - 128;
return uv;
}
이렇게 짰습니다 ㅠㅜ
이미지는 첨부된 yuv 파일을 이용했구요.
색깔이 저리 나오는 걸 보면 변환 혹은 yuv 추출을 잘못한 것 같은데 ㅠㅜ
어디가 잘못 된건지 감이 잘 안 잡히네요...
rgb 변환 공식은 위에 적혀있는 것 외에 여러가지로 사용해봤는데 다 안되더군요 ㅜㅠ