我通过这样做得到了我的ARGB_8888位图的像素数据:
public void getImagePixels(byte[] pixels, Bitmap image) {
// calculate how many bytes our image consists of
int bytes = image.getByteCount();
ByteBuffer buffer = ByteBuffer.allocate(bytes); // Create a new buffer
image.copyPixelsToBuffer(buffer); // Move the byte data to the buffer
pixels = buffer.array(); // Get the underlying array containing the data.
}
但是,我想将这些数据(每个像素存储在四个字节(ARGB)中)转换为每个像素存储在3个字节( BGR )的位置。 任何帮助表示赞赏!
答案 0 :(得分:4)
免责声明:使用Android Bitmap API可以有更好/更容易/更快的方式,但我不熟悉它。如果你想沿着你开始的方向前进,那么你的代码被修改为将4字节ARGB转换为3字节BGR
public byte[] getImagePixels(Bitmap image) {
// calculate how many bytes our image consists of
int bytes = image.getByteCount();
ByteBuffer buffer = ByteBuffer.allocate(bytes); // Create a new buffer
image.copyPixelsToBuffer(buffer); // Move the byte data to the buffer
byte[] temp = buffer.array(); // Get the underlying array containing the data.
byte[] pixels = new byte[(temp.length / 4) * 3]; // Allocate for 3 byte BGR
// Copy pixels into place
for (int i = 0; i < (temp.length / 4); i++) {
pixels[i * 3] = temp[i * 4 + 3]; // B
pixels[i * 3 + 1] = temp[i * 4 + 2]; // G
pixels[i * 3 + 2] = temp[i * 4 + 1]; // R
// Alpha is discarded
}
return pixels;
}
答案 1 :(得分:0)
您可以使用名为OpenCV的强大库来尝试您的技能 - 它是免费的。它允许您从BGR更改为RGB并反转。它还允许您添加或删除Alpha通道(“A”)。
OpenCV有一个专用的Android版本可供下载here (OpenCV for Android v 2.4.6)。
在此库中,请查看this documentation中的 cvtColor(),其中说明了以下内容:
该函数可以执行以下转换:RGB空间内的转换,如添加/删除Alpha通道,反转通道顺序,转换为16位RGB颜色(R5:G6:B5或R5:G5:B5) ,以及转换为灰度等级[...等]
我在Google Play商店(UnCanny)中有一个使用OpenCV for Android的应用。花了一些时间来加快速度,但是有很多功能。
答案 2 :(得分:0)
使用OpenCV
库并通过不同方法获取像素(见下文),您可以使用本机调用替换java函数,并且〜4x更快:
总结:
// reading bitmap from java side:
Mat mFrame = Mat(height,width,CV_8UC4,pFrameData).clone();
Mat mout;
cvtColor(mFrame, mout,CV_RGB2GRAY); // or CV_RGB2XXX (3BGR)
完整示例:
Java方面:
Bitmap bitmap = mTextureView.getBitmap(mWidth, mHeight);
int[] argb = new int[mWidth * mHeight];
// get ARGB pixels and then proccess it with 8UC4 opencv convertion
bitmap.getPixels(argb, 0, mWidth, 0, 0, mWidth, mHeight);
// native method (NDK or CMake)
processFrame8UC4(argb, mWidth, mHeight);
原生方(NDK):
JNIEXPORT jint JNICALL com_native_detector_Utils_processFrame8UC4
(JNIEnv *env, jobject object, jint width, jint height, jintArray frame) {
jint *pFrameData = env->GetIntArrayElements(frame, 0);
// it is the line:
Mat mFrame = Mat(height,width,CV_8UC4,pFrameData).clone();
// the next only is a extra example to gray convertion:
Mat mout;
cvtColor(mFrame, mout,CV_RGB2GRAY); // or CV_RGB2XXX
// your code from here, the next is a example:
int objects = face_detection(env, mout);
// release object
env->ReleaseIntArrayElements(frame, pFrameData, 0);
return objects;
}