如何将ByteArray从ImageMetaData()转换为Bitmap?

时间:2017-12-25 13:24:17

标签: arcore

我有这段代码:

Frame frame = mSession.update();
Camera camera = frame.getCamera();
...
 bytes=frame.getImageMetadata().getByteArray(0);
 System.out.println("Byte Array "+frame.getImageMetadata().getByteArray(0));
 Bitmap bmp = BitmapFactory.decodeByteArray(bytes,0,bytes.length);
 System.out.println(bmp);

当我打印Bitmap时,我得到一个null对象。我试图从相机中获取图像,这就是我尝试将byteArray转换为Bitmap的原因。如果有另一种方式,它也会有所帮助。

谢谢。

3 个答案:

答案 0 :(得分:0)

ImageMetaData描述背景图像,但实际上并不包含图像本身。

如果要将背景图像捕获为位图,则应查看使用FrameBufferObject的computervision示例将图像复制到字节数组。

答案 1 :(得分:0)

我尝试过类似的东西。有用。但我不建议任何人尝试这种方式。由于嵌套循环需要时间。

 CameraImageBuffer inputImage;

final Bitmap bmp =  Bitmap.createBitmap(inputImage.width, inputImage.height, Bitmap.Config.ARGB_8888);
int width = inputImage.width;
int height = inputImage.height;
int frameSize = width*height;

// Write Bytebuffer to byte[] 
byte[] imageBuffer= new byte[inputImage.buffer.remaining()];
inputImage.buffer.get(imageBuffer);

int[] rgba = new int[frameSize];
for (int i = 0; i < height; i++){
    for (int j = 0; j < width; j++) {
        int r =imageBuffer[(i * width + j)*4 + 0];
        int g =imageBuffer[(i * width + j)*4 + 1];
        int b =imageBuffer[(i * width + j)*4 + 2];
        rgba[i * width + j] = 0xff000000 + (b << 16) + (g << 8) + r;
    }
}
bmp.setPixels(rgba, 0, width , 0, 0, width, height);

Bytebuffer转换为rgba缓冲区,并写入Bitmap。 CameraImageBuffer是computervision示例应用程序中提供的类。

答案 2 :(得分:0)

您可能无法使用图像元数据获取位图。使用以下方法。使用表面视图渲染的onDrawFrame覆盖方法。

 @Override public void onDrawFrame(GL10 gl) {
    int w = 1080;
    int h = 1080;
    int b[] = new int[w * (0 + h)];
    int bt[] = new int[w * h];
    IntBuffer ib = IntBuffer.wrap(b);
    ib.position(0);
    GLES20.glReadPixels(0, 0, w, h, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ib);

    for (int i = 0, k = 0; i < h; i++, k++) {
        for (int j = 0; j < w; j++) {
            int pix = b[i * w + j];
            int pb = (pix >> 16) & 0xff;
            int pr = (pix << 16) & 0x00ff0000;
            int pix1 = (pix & 0xff00ff00) | pr | pb;
            bt[(h - k - 1) * w + j] = pix1;
        }
    }

    Bitmap mBitmap = Bitmap.createBitmap(bt, w, h, Bitmap.Config.ARGB_8888);

    runOnUiThread(new Runnable() {
        @Override public void run() {
            image_test.setImageBitmap(resizedBitmap);
        }
    });
}