inputImageFromCameraImage static method

({InputImage image, Size size})? inputImageFromCameraImage(
  1. CameraImage image,
  2. CameraController? cameraController,
  3. List<CameraDescription> cameras,
  4. CameraLensDirection cameraLensDirection,
)

Implementation

static ({InputImage image, Size size})? inputImageFromCameraImage(
    CameraImage image,
    CameraController? cameraController,
    List<CameraDescription> cameras,
    CameraLensDirection cameraLensDirection) {
  final controller = cameraController;
  if (controller == null) return null;

  final camera = cameras.firstWhere(
    (c) => c.lensDirection == cameraLensDirection,
    orElse: () => cameras.first,
  );

  final sensorOrientation = camera.sensorOrientation;
  final orientations = {
    DeviceOrientation.portraitUp: 0,
    DeviceOrientation.landscapeLeft: 90,
    DeviceOrientation.portraitDown: 180,
    DeviceOrientation.landscapeRight: 270,
  };

  final deviceOrientation = controller.value.deviceOrientation;
  final orientation = orientations[deviceOrientation];
  if (orientation == null) return null;

  InputImageRotation? rotation;
  if (camera.lensDirection == CameraLensDirection.front) {
    rotation = InputImageRotationValue.fromRawValue(
        (sensorOrientation + orientation) % 360);
  } else {
    rotation = InputImageRotationValue.fromRawValue(
        (sensorOrientation - orientation + 360) % 360);
  }

  if (rotation == null) return null;

  // Convert YUV planes into byte buffer
  final WriteBuffer allBytes = WriteBuffer();
  for (Plane plane in image.planes) {
    allBytes.putUint8List(plane.bytes);
  }

  final bytes = allBytes.done().buffer.asUint8List();

  final metadata = InputImageMetadata(
    size: Size(image.width.toDouble(), image.height.toDouble()),
    rotation: rotation,
    format: InputImageFormat.nv21,
    bytesPerRow: image.planes.first.bytesPerRow,
  );

  return (
    image: InputImage.fromBytes(
      bytes: bytes,
      metadata: metadata,
    ),
    size: metadata.size
  );
}