调试工程的时候,提出需要接管 sceneform 框架的视频数据,说白了就是接管帧数据,也就意味着,处理完帧数据以后,需要手动转为可以显示的图片资源;网上一大片 ImageView 转 bitmap 什么鬼的,已经不是帧数据了,要想从 sceneform 框架中获取当前摄像头的帧数据可以通过 frame 的 acquireCameraImage 方法获取当前帧
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 所以代码看起来比较奇怪