JNI Image RGBA格式轉(zhuǎn)NV21

以480640尺寸為例
Image對(duì)象獲取到的RGBA_8888數(shù)據(jù)格式分析如下
1.getPixelStride方法獲取相鄰像素間距 = 4
2.getRowStride方法獲取行跨度 = 2048
3.2048-4
480 = 128,說(shuō)明每行多出128個(gè)byte,這128個(gè)byte表示行填充的值,里面的數(shù)據(jù)為無(wú)效數(shù)據(jù)。
4.轉(zhuǎn)換:需要將每行的最后128個(gè)數(shù)據(jù)忽略掉,再進(jìn)行轉(zhuǎn)換

JNIEXPORT void JNICALL
Java_com_xxx_xxx_RGBAtoNV21(JNIEnv *env,
                                                                  jclass clazz,
                                                                  jbyteArray rgbasp,
                                                                  jint width,
                                                                  jint height,
                                                                  jint rowPadding,//行填充的值
                                                                  jbyteArray yuvOut) {
    jbyte *yuvData = (jbyte *) ((*env)->GetPrimitiveArrayCritical(env, yuvOut, 0));
    jbyte *rgba = (jbyte *) ((*env)->GetPrimitiveArrayCritical(env, rgbasp, 0));
    int length = (*env)->GetArrayLength(env, yuvOut);
    int yIndex = 0;
    int uvIndex = width * height;
    int argbIndex = 0;
    int R, G, B, Y, U, V;
    for (int j = 0; j < height; ++j) {
        for (int i = 0; i < width; ++i) {
            R = rgba[argbIndex++] & 0xFF;
            G = rgba[argbIndex++] & 0xFF;
            B = rgba[argbIndex++] & 0xFF;
            argbIndex++;//跳過(guò)a
            Y = ((66 * R + 129 * G + 25 * B + 128) >> 8) + 16;
            yuvData[yIndex++] = ((Y > 0xFF) ? 0xFF : ((Y < 0) ? 0 : Y));
            //__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "%hhd", yuvData[yIndex - 1]);
            if ((j & 1) == 0 && ((argbIndex >> 2) & 1) == 0 && uvIndex < length - 2) {
                U = ((-38 * R - 74 * G + 112 * B + 128) >> 8) + 128;
                V = ((112 * R - 94 * G - 18 * B + 128) >> 8) + 128;
                yuvData[uvIndex++] = ((V > 0xFF) ? 0xFF : ((V < 0) ? 0 : V));
                yuvData[uvIndex++] = ((U > 0xFF) ? 0xFF : ((U < 0) ? 0 : U));
            }
        }
        argbIndex += rowPadding;    //跳過(guò)rowPadding長(zhǎng)度的填充數(shù)據(jù)
    }
    //__android_log_print(ANDROID_LOG_ERROR, LOG_TAG,"%s",s);
    (*env)->ReleasePrimitiveArrayCritical(env, rgbasp, rgba, 0);
    (*env)->ReleasePrimitiveArrayCritical(env, yuvOut, yuvData, 0);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容