Files
alibaba--mnn/source/jni/mnnportraitnative.cpp
2026-07-13 13:33:03 +08:00

79 lines
2.2 KiB
C++

//
// mnnportraitnative.cpp
// MNN
//
// Created by MNN on 2019/01/29.
// Copyright © 2018, Alibaba Group Holding Limited
//
#include <android/bitmap.h>
#include <jni.h>
#include <string.h>
#include <MNN/ImageProcess.hpp>
#include <MNN/Interpreter.hpp>
#include <MNN/Tensor.hpp>
#include <memory>
extern "C" JNIEXPORT jintArray JNICALL
Java_com_taobao_android_mnn_MNNPortraitNative_nativeConvertMaskToPixelsMultiChannels(JNIEnv *env, jclass jclazz,
jfloatArray jmaskarray,
jint length) {
float *scores = (float *)env->GetFloatArrayElements(jmaskarray, 0);
int dst32[length];
#if 0
for (int l = 0; l < length; l++) {
int* dst = dst32 + l;
float* src = scores + l;
float max = scores[l];
float min = scores[l];
for(int c = 0; c < 21; c++){
float data = src[c*length];
if(max < data){
max = data;
}
if(min > data){
min = data;
}
}
unsigned data = src[15*length];
float range = 255.0f / (exp(max) - exp(min));
float result = (exp(data) - exp(min)) * range;
unsigned result_uint8 = result > 255.0f ? 255 : result;
unsigned a = result_uint8;
unsigned r = a;
unsigned g = a;
unsigned b = a;
// ARGB
dst[0] = a << 24 | r << 16 | g << 8 | b;
}
#else
for (int l = 0; l < length; l++) {
int *dst = dst32 + l;
float *src = scores + l;
float max = scores[l];
for (int c = 0; c < 21; c++) {
if (max < src[c * length]) {
max = src[c * length];
}
}
unsigned a = src[15 * length] == max ? 0 : 255;
unsigned r = a;
unsigned g = a;
unsigned b = a;
// ARGB
dst[0] = a << 24 | r << 16 | g << 8 | b;
}
#endif
jintArray arr = env->NewIntArray(length);
env->SetIntArrayRegion(arr, 0, length, dst32);
env->ReleaseFloatArrayElements(jmaskarray, scores, 0);
return arr;
}