我正在使用camera
flutter lib和控制器的startImageStream
方法,每X毫秒我得到一个CameraImage
输入,并希望将其保存为jpg/png文件
我正在使用一些代码在网上找到,但它有2个问题
1.它是灰度的,没有任何颜色
1.逆时针旋转90度
我现在使用的代码是
import 'package:camera/camera.dart';
import 'package:image/image.dart' as imglib;
Future<List<int>> convertImageToPng(CameraImage image) async {
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<int> png = pngEncoder.encodeImage(img!);
return png;
}
// CameraImage BGRA8888 -> PNG
// Color
imglib.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 (compression:0, filter: none)
// Black
imglib.Image _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 color
var newVal = shift | (pixelColor << 16) | (pixelColor << 8) | pixelColor;
img.data[planeOffset + x] = newVal;
}
}
return img;
}
方法convertImageToPng
我需要一个跨平台的ios+android的方法来转换CameraImage到jpg/png与适当的颜色和不旋转。
_controller?.startImageStream(
(image) {
final asPng = await convertImageToPng(image);
// todo then I save this on disk or uploa
},
);
任何帮助都将不胜感激。
1条答案
按热度按时间j5fpnvbx1#
要捕获和保存图像,您可以使用以下方法。
然后用你的方法:
或者作为替代方案:
要向右旋转,你可以使用这个,传递bytedata的As UintList:
要通过传递原始图像来获得旋转图像,您可以用途: