如何在Android模拟器上显示垫子图像?使用NDK
How to display Mat image on android emulator? Using NDK
我想在Android模拟器上显示垫子图像。我将资产管理器从java
传递到c++
,并将图像作为资产加载。然后,我执行AASSET_READ,然后将图像数据保存到char*缓冲区中,然后使用cv::imdecode
转换为垫子。从这里,我该如何将垫子图像添加到仿真器?
在默认的 stringFromJNI
方法中,他们似乎使用re turn->envNewStringUTF(hello.c_str());
显示文本:
Java_com_example_user_project_MainActivity_stringFromJNI(JNIEnv *env, jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
那么我该如何使用垫子图像进行此操作?
编辑:这是我的C 代码:
JNIEXPORT jintArray JNICALL Java_com_example_user_activity_MainActivity_generateAssets(JNIEnv* env,jobject thiz,jobject assetManager) {
AAsset* img;
AAssetManager *mgr = AAssetManager_fromJava(env, assetManager);
AAssetDir* assetDir = AAssetManager_openDir(mgr, "");
const char* filename;
while ((filename = AAssetDir_getNextFileName(assetDir)) != NULL) {
AAsset *asset = AAssetManager_open(mgr, filename, AASSET_MODE_UNKNOWN);
if(strcmp(filename, "hi.jpg")==0 ) {
img = asset;
}
}
long sizeOfImg = AAsset_getLength(img);
char* buffer = (char*) malloc (sizeof(char)*sizeOfImg);
AAsset_read(img, buffer, sizeOfImg);
std::vector<char> data(buffer, buffer + sizeOfImg);
cv::Mat h = cv::imdecode(data, IMREAD_UNCHANGED);
jintArray resultImage = env->NewIntArray(h.total());
jint *_data = new jint[h.total()];
for (int i = 0; i < h.total(); i++) {
char b = h.data[4 * i];
char g = h.data[4 * i + 1];
char r = h.data[4 * i + 2];
char a = 255;
_data[i] = (((jint) a << 24) & 0xFF000000) + (((jint) r << 16) & 0x00FF0000) +
(((jint) g << 8) & 0x0000FF00) + ((jint) b & 0x000000FF);
}
env->SetIntArrayRegion(resultImage, 0, h.total(), _data);
delete[]_data;
return resultImage;
}
和Java代码:
assetManager = getAssets();
resultImage = generateAssets(assetManager);
Bitmap imageinjava = Bitmap.createBitmap(resultImage, 100,100, Bitmap.Config.ARGB_8888);
ImageView tv1;
tv1= (ImageView) findViewById(R.id.image);
tv1.setImageBitmap(imageinjava);
为了转换本机垫图像,您可以做到这一点:
JNIEXPORT jintArray JNICALL Java_com_example_user_activity_MainActivity_generateAssets(JNIEnv* env, jobject thiz, jobject assetManager) {
AAssetManager *mgr = AAssetManager_fromJava(env, assetManager);
AAsset *img = AAssetManager_open(mgr, "hi.jpg", AASSET_MODE_UNKNOWN);
long sizeOfImg = AAsset_getLength(img);
char* buffer = (char*)AAsset_getBuffer(img);
std::vector<char> data(buffer, buffer + sizeOfImg);
cv::Mat h = cv::imdecode(data, IMREAD_UNCHANGED);
jintArray resultImage = env->NewIntArray(h.total());
jint *_data = new jint[h.total()];
for (int i = 0; i < h.total(); i++) {
char b = h.data[h.channels() * i];
char g = h.data[h.channels() * i + 1];
char r = h.data[h.channels() * i + 2];
char a = 255;
_data[i] = (((jint) a << 24) & 0xFF000000) + (((jint) r << 16) & 0x00FF0000) +
(((jint) g << 8) & 0x0000FF00) + ((jint) b & 0x000000FF);
}
env->SetIntArrayRegion(resultImage, 0, h.total(), _data);
delete[]_data;
return resultImage;
}
和在您的Java代码中,如
int[] result = generateAssets(getAssets());
Bitmap bitmap = Bitmap.createBitmap(result, yourimagewidth, yourimageheight, Bitmap.Config.ARGB_8888);
如果要在C 和Java之间传递本机垫子 - 将指针返回到您的垫子,然后将其传递到本机函数;
;Mat *mat = new Mat(100, 100);
return (jlong) mat;
相关文章:
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- 如何使用按钮更新GTK3图像以使用C++从相机捕获图片
- Gstreamer:每 5 秒使用多文件墨水保存图像/jpeg
- 如何使用CImg打开图像?
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- 使用 CUDA 和纹理进行图像减法
- 使用 ImageIO.read() 生成的图像是否仍然使用传递给它的相同内存?
- 如何在Android模拟器上显示垫子图像?使用NDK
- OpenCV:如何使用阈值正确分割图像/使用二进制图像对原始图像进行分割
- 从文件中读取的空图像(使用文件路径)
- 何时对图像使用对数极坐标变换
- 比较两个图像使用OpenGL
- 锐化视频图像使用openCV
- 缩放像素的图像使用opencv库和c++
- 最快50%缩放(A)RGB32图像使用sse intrinsic
- 我应该如何去实现算法与黑白和彩色图像使用
- 库的简单解释,以及如何在c++中使用它们进行图像使用
- c++, opencv:在过滤操作中对源和目标图像使用相同的Mat是否安全?