在Flutter中读取/转换相机流图像

时间:2019-11-14 01:37:15

标签: flutter dart

在我的iOS设备上,我正在使用CameraController通过camera(由controller.startImageStream((CameraImage img) {...}软件包提供)访问相机

从相机中出来的数据在我的手机上是bgra8888格式,但是我已经读到它在android设备上是yuv420。要将图像流数据转换为可用的一致格式,我使用:

import 'dart:typed_data';
import 'package:camera/camera.dart';
import 'package:image/image.dart' as im;

Uint8List concatenatePlanes(List<Plane> planes) {
  final WriteBuffer allBytes = WriteBuffer();
  planes.forEach((Plane plane) => allBytes.putUint8List(plane.bytes));
  return allBytes.done().buffer.asUint8List();
}

List<CameraDescription> cameras = await availableCameras();
CameraController controller = CameraController(cameras[0], ResolutionPreset.medium);

controller.startImageStream((CameraImage img) {
  print(img.format.group); // returns ImageFormatGroup.bgra8888

  List<int> imgData = concatenatePlanes(img.planes);
  im.Image image = im.decodeImage(imgData);
});

imgData变量充满了从相机流式传输的数据,但是从解码图像返回的转换后的image为空。

我在其他帖子上读到,image软件包可以完成解码bgra8888 / yuv420图像(https://stackoverflow.com/a/57635827/479947)的任务,但是我看不到它的formats.dart源代码支持( https://github.com/brendan-duncan/image/blob/master/lib/src/formats/formats.dart

目标Image格式定义为:

  

图像缓冲区,其中像素被编码为32位无符号整数   (Uint32)。像素以32位无符号整数存储在#AARRGGBB中   格式。这与Flutter图片数据一致。

如何将bgra8888 / yuv420中的图像流图像转换为所需的图像格式?

1 个答案:

答案 0 :(得分:1)

您检查了吗? convertImage

如果您从bgra8888转换为Image,这比较快,但是从yuv420转换为Image需要更多时间,因此,如果您对性能有疑问,我可以为您提供一些帮助。顺便说一句,如果您遇到性能问题并尝试使用隔离,您将遇到内存问题。