inputImageFromCameraImage static method
({InputImage image, Size size})?
inputImageFromCameraImage(
- CameraImage image,
- CameraController? cameraController,
- List<
CameraDescription> cameras, - 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
);
}