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

12 篇文章 4 订阅
11 篇文章 3 订阅

调试工程的时候,提出需要接管 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 所以代码看起来比较奇怪

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值