Flutter相机插件startImageStream函数的CameraImage类型如何处理

632 阅读1分钟

我需要拿到CameraImag后将其转换为Uint8List类型 网上找到了dart的处理方法 但是效率贼低 CameraImage在Android平台为YUV420类型 iOS平台为bgra8888类型

static 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 = imglib.PngEncoder();
      // Convert to png
      List png = pngEncoder.encodeImage(img!);
      return png as Uint8List;
    } catch (e, stackTrace) {
      LogUtil.e(">>>>>>>>>>>> ERROR:${e.toString()}");
      LogUtil.e(stackTrace);
    }
    return null;
  }
  
  static convertBGRA8888(CameraImage image) {
    return imglib.Image.fromBytes(
      image.width,
      image.height,
      image.planes[0].bytes,
      format: imglib.Format.bgra,
    );
  }
  
    static convertYUV420(CameraImage image) {
    var img = imglib.Image(image.width, image.height);
    // Create Image buffer
    Plane plane = image.planes[0];
    const int shift = (0xFF << 24);
    // Fill image buffer with plane[0] from YUV420_888
    for (int x = 0; x < image.width; x++) {
      for (int planeOffset = 0;
          planeOffset < image.height * image.width;
          planeOffset += image.width) {
        final pixelColor = plane.bytes[planeOffset + x];
        // color: 0x FF  FF  FF  FF
        //           A   B   G   R
        // Calculate pixel  ;colorvar
        var newVal =
            shift | (pixelColor << 16) | (pixelColor << 8) | pixelColor;
        img.data[planeOffset + x] = newVal;
      }
    }
    return img;
  }

这样处理效率太低 于是我给Android找到了一个插件 YUVtransform

image.png 使用这个方法可以快速处理YUV420类型的图片数据 但是处理不了iOS的bgra8888 有没有大佬知道如何处理