将图像转换为无符号字符*
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将图像转换为无符号字符*相关的知识,希望对你有一定的参考价值。
我正在开发一个使用NDK与外部SDK通信的应用程序,用于处理图像数据。用于图像的SDK的输入类型是unsigned char *。在ios中它工作正常,下面是在那里使用的Objective-C代码。
unsigned char *dataImage = (unsigned char*)
malloc(bytesPerRow*height);
CGColorSpaceRef colors = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(dataImage, width,height, BITSPERCOMPS, bytesPerRow, colors,
(CGBitmapInfo)kCGImageAlphaNoneSkipLast);
CGContextDrawImage(context, CGRectMake(0.f, 0.f, width, height), imageRef);
此dataImage传递给SDK,它返回正确的结果。现在,我正在尝试在android中生成类似的图像数据流,但SDK始终返回false。以下是我在Android中将图像转换为unsigned char *所执行的步骤,
- 获取位图/ base64(同时尝试使用)图像数据
- 从bitmap / base64获取字节数组
- 将字节数组传递给C ++
- 在C ++中将字节数组转换为unsigned char *(因为unsigned char *在Android / Java中不可用,我必须在C ++部分转换它)
这是转换为unsigned char *的代码
int len = (*env)->GetArrayLength (env,image);
unsigned char* buf = malloc(len);
(*env)->GetByteArrayRegion (env,image, 0, len, (jbyte *) buf);
这是android中unsigned char * dump的开始
"x89PNG
x1a
"
这是在Objective C中生成的unsigned char *
A^X
M^?B^YM^?B^YM^?B^ZM^?B^
M^?B^
M^?C^]^NM^?D^]^NM^?E^_^PM^?D^^^OM^?A^
答案
我假设你对Android NDK非常熟悉,如果没有,那么看看here。我没有测试它,但我会这样做:
1)加载位图并从outputStream获取byteArray:
Bitmap bmp; // your bitmap
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream .toByteArray();
// Call native function defined below
passByteArrayToJni(byteArray);
2)在你的班级某处声明原生函数
// Declare native function in NDK
public native passByteArrayToJni(byte[] byteArray);
3)在.cpp文件中:
extern "C" {
JNIEXPORT void JNICALL Java_com_packageX_ClassY_passByteArrayToJni( JNIEnv* env, jobject thiz, jbyteArray byteArray);
{
// Reads byte array to * cBytes
jbyte * cBytes = env->GetByteArrayElements(byteArray, &isCopy);
// Gets the size
jsize len = (*env)->GetArrayLength(env, byteArray);
// Get region
unsigned char* buf = malloc(len);
(*env)->GetByteArrayRegion (env,cBytes, 0, len, reinterpret_cast<jbyte*>(buf));
// Releases array when done with it.
env->ReleaseByteArrayElements(byteArray, cBytes, JNI_ABORT);
}
}
希望对你有用,请告诉我是否有任何问题。
以上是关于将图像转换为无符号字符*的主要内容,如果未能解决你的问题,请参考以下文章