flutter cameraimage to png

Flutter中的 CameraImage 对象表示来自相机的原始图像数据,通常在将其保存为PNG或其他图像格式之前,需要先对其进行处理和转换。

下面是将 CameraImage 转换为PNG的基本步骤:

导入相关库

import 'dart:io';
import 'dart:typed_data';
import 'package:image/image.dart' as img;

在此代码中,我们使用了dart:io库来处理文件操作,dart:typed_data库来处理二进制数据,以及image库来处理图像数据。

CameraImage转换为img.Image对象

img.Image cameraImageToImage(CameraImage image) {
  var planeBytes = image.planes.map((plane) {
    return plane.bytes;
  }).toList();
  var width = image.width;
  var height = image.height;
  var format = img.Format.bgra;
  if (image.format == ImageFormat.yuv420) {
    format = img.Format.yCbCr;
  return img.Image.fromBytes(width, height, format, planeBytes);

这个函数将CameraImage对象转换为img.Image对象。它首先获取所有平面(plane)的字节数组,并使用图像的宽度和高度以及格式创建一个新的img.Image对象。对于不同的图像格式,需要使用不同的像素格式,这里我们将格式设置为bgrayCbCr,具体取决于图像的格式。

img.Image对象保存为PNG文件

Future<File> saveImage(img.Image image, String filePath) async {
  var png = img.encodePng(image);
  var file = File(filePath);
  return await file.writeAsBytes(png);

这个函数将img.Image对象编码为PNG格式,并将其写入到指定的文件路径中。我们使用File.writeAsBytes()方法来保存PNG数据。

完整的示例代码如下所示:

import 'dart:io';
import 'dart:typed_data';
import 'package:image/image.dart' as img;
Future<File> saveCameraImageAsPng(CameraImage image, String filePath) async {
  var img = cameraImageToImage(image);
  var png = img.encodePng(img);
  var file = File(filePath);
  return await file.writeAsBytes(png);
img.Image cameraImageToImage(CameraImage image) {
  var planeBytes = image.planes.map((plane) {
    return plane.bytes;
  }).toList();
  var width = image.width;
  var height = image.height;
  var format = img.Format.bgra;
  if (image.format == ImageFormat.yuv420) {
    format = img.Format.yCbCr;
  return img.Image.fromBytes(width, height, format, planeBytes);

请注意,上述代码仅是将CameraImage对象转换为PNG格式的基本方法。具体的实现可能会因为不同的需求而有所不同。例如,如果您需要将图像压缩为不同的大小,可以使用image库中的其他方法来调整图像大小和质量。

  •