如何方形裁剪相机Flutter中的图像



我正在创建一个扫描仪,我需要对相机预览实现方形覆盖,我从相机预览中获取图像流并将其发送到API,现在添加方形覆盖后,我需要在将其发送给API之前对从相机预览获取的Camera图像进行方形裁剪。

我只拍摄了cameraImage,它是YUV420格式的,我如何通过编程裁剪它?

我想对于完整的图像,你编码了这样的东西:

Uint8List getBytes() {
final WriteBuffer allBytes = WriteBuffer();
for (final Plane plane in cameraImage.planes) {
allBytes.putUint8List(plane.bytes);
}
return allBytes.done().buffer.asUint8List();
}

事实上,您正在一个接一个地连接YUV的三个平面的数据:所有Y,然后所有U,然后所有V。正如您在维基百科页面中看到的,平面Y的宽度和高度与图像相同,而平面U和V使用宽度/2和高度/2。如果我们一个字节接一个字节,这意味着上面的代码类似于下面的代码:

int divider = 1; // for first plane: Y
for (final Plane plane in cameraImage.planes) {
for (int i = 0; i < cameraImage.height ~/ divider; i++) {
for (int j = 0; j < cameraImage.width ~/ divider; j++) {
allBytes.putUint8(plane.bytes[j + i * cameraImage.width ~/ divider]);
}
}
divider = 2; // for planes U and V
}

既然你来了,我想你明白如何裁剪了:

int divider = 1; // for first plane: Y
for (final Plane plane in cameraImage.planes) {
for (int i = cropTop ~/ divider; i < cropBottom ~/ divider; i++) {
for (int j = cropLeft ~/ divider; j < cropRight ~/ divider; j++) {
allBytes.putUint8(plane.bytes[j + i * cameraImage.width ~/ divider]);
}
}
divider = 2; // for planes U and V
}

其中从完整图像计算裁剪*变量。

这就是理论:这段代码没有考虑相机的方向、奇怪尺寸可能产生的副作用和性能。但这只是一般的想法。

最新更新