js image 获取rgb_Flutter中通过ImageStream实时流获取图像

概要: 本文主要讲解在Flutter通过Dart、JAVA和C三种方式,将相机获取的实时流数据转换为RGB格式。 目录: 1. 前言 2. Dart原生解析YUV 3. JAVA解析YUV 4. C解析YUV 5. 总结

1

前言 使用camera插件的图像流功能, 以及 如何安装camera插件这里不做过多解释。 我们主要调用camera controller 的 startImageStream 方法获取图像流。 这个方法在每次有新的帧数据时会被触发。
_controller.startImageStream((CameraImage imageStream) {
     //_controller.stopImageStream();// planes include Y,U,V plane on Android        // planes include RGBA on IOSvar framesY = imageStream.planes[0].bytes;var framesU = imageStream.planes[1].bytes;var framesV = imageStream.planes[2].bytes;var lenU = framesU.length;var lenV = framesV.length;var lenY = framesY.length;print('$lenU'+' '+'$lenV'+' '+'$lenY');      });
 输出的imageStream中包含图像的四个属性,分别是: 格式、宽度、高度和planes,其中planes中包含了图像的具体信息,下图是CameraImage的源码,请自行对照 f15e6c121676fadff7479ac5b1339fbd.png 注意: 由于FLutter是跨平台技术,所以在不同平台上获取的数据流格式也并不相同,这里只讲在Android和IOS中的格式: Android:android.graphics.ImageFormat.YUV_420_888(简称:YUV) IOS:kCVPixelFormatType_32BGRA(简称:BGRA) 由于图像格式不同,所以包含的信息也不同: Android:planes 含有三个字节数组,分别是 Y、U 和 V plane IOS:planes 只包含一个字节数组,即图像的 RGBA 字节 所以,获取到图像的planes数据只是第一步,下面的才是硬货。 解析planes数据 这里提供三种方式解析数据流,分别是Dart原生、JAVA和C,只讲Android平台的具体实例。

2

Dart解析YUV420到RGB 由于Flutter中image插件在Android和IOS上解析速度很慢,所以这种方式不建议采用,具体代码如下:
import 'package:image/image.dart' as imglib;import 'package:camera/camera.dart';/// Flutter Camera YUV_420_888 on Android, 32RGBA on IOS/// YUV420 to RGB converter function  but is slowFuture> convertImageToPng(CameraImage image) async {
     try {
         imglib.Image img;if (image.format.group == ImageFormatGroup.yuv420) {
           img = _convertYUV420(image);    } else if (image.format.group == ImageFormatGroup.bgra8888) {
           img = _convertBGRA8888(image);    }    imglib.PngEncoder pngEncoder = new imglib.PngEncoder();// Convert to png    List png = pngEncoder.encodeImage(img);return png;  } catch (e) {
         print(">>>>>>>>>>>> ERROR:" + e.toString());  }return null;}// CameraImage BGRA8888 -> PNG// Colorimglib.Image _convertBGRA8888(CameraImage image) {
     return imglib.Image.fromBytes(    image.width,    image.height,    image.planes[0].bytes,    format: imglib.Format.bgra,  );}// CameraImage YUV420_888 -> PNG -> Image (compresion:0, filter: none)// Blackimglib.Image _conver
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值