jni中 YV12转ARGB 与 NV21转ARGB
来源:互联网 发布:马龙职业生涯数据 编辑:程序博客网 时间:2024/05/02 00:30
注意一点,“>>"和"<<" 移位操作符的运行优先级 比加减法低
void JNICALL Java_com_ym_camera_LibBlurModule_YV12toRBGA
(JNIEnv * env, jclass obj, jbyteArray yuv420sp, jint width, jint height, jintArray rgbOut){
int sz;
int i;
int j;
int Y;
int Cr = 0;//v
int Cb = 0;//u
int pixPtr = 0;
int jDiv2 = 0;
int R = 0;
int G = 0;
int B = 0;
int cOffCr;//v
int cOffCb;//u
int w = width;int h = height;
sz = w * h;
jint *rgbData = (jint*) ((*env)->GetPrimitiveArrayCritical(env, rgbOut, 0));
jbyte* yuv = (jbyte*) (*env)->GetPrimitiveArrayCritical(env, yuv420sp, 0);
for(j = 0; j < h; j++) {
pixPtr = j * w;
jDiv2 = j >> 1;
for(i = 0; i < w; i++) {
Y = yuv[pixPtr];
if(Y < 0) {
Y += 255;
}
if((i & 0x1) != 1) {//024
if(cOffCb >(sz+(sz>>1))){
}
cOffCb = sz + ((jDiv2 * w)>>1) + (i >> 1) * 1;
cOffCr = cOffCb + (sz>>2);
Cb = yuv[cOffCb];
if(Cb < 0)
{
Cb += 127;
}
else{
Cb -= 128;
}
Cr = yuv[cOffCr];
if(Cr < 0)
{
Cr += 127;
}
else{
Cr -= 128;
}
}
R = Y + Cr + (Cr >> 2) + (Cr >> 3) + (Cr >> 5);
if(R < 0) {
R = 0;
}
else if(R > 255) {
R = 255;
}
G = Y - (Cb >> 2) + (Cb >> 4) + (Cb >> 5) - (Cr >> 1) + (Cr >> 3) + (Cr >> 4) + (Cr >> 5);
if(G < 0) {
G = 0;
}
else if(G > 255) {
G = 255;
}
B = Y + Cb + (Cb >> 1) + (Cb >> 2) + (Cb >> 6);
if(B < 0) {
B = 0;
}
else if(B > 255) {
B = 255;
}
rgbData[pixPtr++] = 0xff000000 + (R << 16) + (G << 8) + B;
}
}
(*env)->ReleasePrimitiveArrayCritical(env, rgbOut, rgbData, 0);
(*env)->ReleasePrimitiveArrayCritical(env, yuv420sp, yuv, 0);
}
void JNICALL Java_com_ym_camera_LibBlurModule_NV21toRBGA
(JNIEnv * env, jclass obj, jbyteArray yuv420sp, jint width, jint height, jintArray rgbOut)
{
int sz;
int i;
int j;
int Y;
int Cr = 0;
int Cb = 0;
int pixPtr = 0;
int jDiv2 = 0;
int R = 0;
int G = 0;
int B = 0;
int cOff;
int w = width;int h = height;
sz = w * h;
jint *rgbData = (jint*) ((*env)->GetPrimitiveArrayCritical(env, rgbOut, 0));
jbyte* yuv = (jbyte*) (*env)->GetPrimitiveArrayCritical(env, yuv420sp, 0);
for(j = 0; j < h; j++) {
pixPtr = j * w;
jDiv2 = j >> 1;
for(i = 0; i < w; i++) {
Y = yuv[pixPtr];
if(Y < 0) {
Y += 255;
}
if((i & 0x1) != 1) {
cOff = sz + jDiv2 * w + (i >> 1) * 2;
Cb = yuv[cOff];
if(Cb < 0)
{
Cb += 127;
}
else{
Cb -= 128;
}
Cr = yuv[cOff + 1];
if(Cr < 0)
{
Cr += 127;
}
else{
Cr -= 128;
}
}
R = Y + Cr + (Cr >> 2) + (Cr >> 3) + (Cr >> 5);
if(R < 0) {
R = 0;
}
else if(R > 255) {
R = 255;
}
G = Y - (Cb >> 2) + (Cb >> 4) + (Cb >> 5) - (Cr >> 1) + (Cr >> 3) + (Cr >> 4) + (Cr >> 5);
if(G < 0) {
G = 0;
}
else if(G > 255) {
G = 255;
}
B = Y + Cb + (Cb >> 1) + (Cb >> 2) + (Cb >> 6);
if(B < 0) {
B = 0;
}
else if(B > 255) {
B = 255;
}
//rgbData[pixPtr++] = 0xff000000 + (B << 16) + (G << 8) + R;
rgbData[pixPtr++] = 0xff000000 + (R << 16) + (G << 8) + B;
}
}
//gaussBlur(rgbData,width,height,3);
(*env)->ReleasePrimitiveArrayCritical(env, rgbOut, rgbData, 0);
(*env)->ReleasePrimitiveArrayCritical(env, yuv420sp, yuv, 0);
}
阅读全文
0 0
- jni中 YV12转ARGB 与 NV21转ARGB
- Android下NV21转ARGB的方法
- YUV转RGB(NV21-ARGB)的Neon优化代码
- YUV转RGB(NV21-ARGB)的Neon优化代码
- android ARGB 转 RGB
- ARGB
- ARGB
- ARGB
- Android中argb颜色值与int互转
- 什么是ARGB
- ARGB 排布
- ARGB颜色合成与提取公式
- ARGB颜色合成与提取公式
- ARGB中右移和按位与操作
- ARGB与RGB、RGBA的区别
- ARGB 颜色取值与透明度搭配
- ARGB与RGB、RGBA的区别
- ARGB与RGB、RGBA的区别
- Android工程依赖:android中打包带有Activity以及资源文件的jar包在工程中调用
- Java中BigInteger类常用接口方法
- Linux(六)
- 机器学习-Python编写FP-growth进行关联性分析
- pat 甲级 1019
- jni中 YV12转ARGB 与 NV21转ARGB
- SolidWorks设计PCB 3D模型展示
- 计算机网络读书笔记
- 关于后台线程的简单介绍
- JavaScript 动画之tab切换
- pat 甲级 1023-1026
- LintCode之22 平面列表
- Linux(七)
- 算法-爬楼梯