ARCore 使用 SceneForm 框架 —— Image(通过 acquireCameraImage 获取)转 Bitmap

调试工程的时候,提出需要接管 sceneform 框架的视频数据,说白了就是接管帧数据,也就意味着,处理完帧数据以后,需要手动转为可以显示的图片资源;网上一大片 ImageView 转 bitmap 什么鬼的,已经不是帧数据了,要想从 sceneform 框架中获取当前摄像头的帧数据可以通过 frameacquireCameraImage 方法获取当前帧

    public static Bitmap getBitmapFromImage(Image img) {
        //ImageFormat.YUV_420_888 的 format 数值 35

        ByteBuffer buffer = formatBuffer(img);
        if (buffer == null) {
            return null;
        }

        buffer.rewind();
        byte[] bytes = new byte[buffer.limit()];
        buffer.get(bytes, 0, bytes.length);

        YuvImage yuvimage = new YuvImage(bytes, ImageFormat.NV21, img.getWidth(), img.getHeight(), null);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        yuvimage.compressToJpeg(new Rect(0, 0, img.getWidth(), img.getHeight()), 80, baos);
        byte[] jdata = baos.toByteArray();
        Bitmap bitmapImage = BitmapFactory.decodeByteArray(jdata, 0, jdata.length);
        try {
            baos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        if(bitmapImage != null) {
            return bitmapImage;
        }
        return null;
    }

下面是调用上述的 Image 转 Bitmap 方法代码块,调用上述方法时需要确认 YUV 的格式是否是 ImageFormat.YUV_420_888,对应的 format 数值时 35

    var frame = arFragment!!.arSceneView.arFrame
    var toShow  = frame!!.acquireCameraImage() as ArImage
    var tmpSize = Point(toShow.width, toShow.height)
    var bitmapImage = Utils.getBitmapFromImage(toShow)

Kotlin 和 Java 是支持混编的,再加上最近在学习 Kotlin 所以代码看起来比较奇怪

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章