You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Uint8List图片数据绘制方框并保存

无UI图片编辑:在Uint8List图片中绘制人脸框并保存

依赖准备

首先在pubspec.yaml中添加图片处理依赖包,用于像素级图片编辑:

dependencies:
  image: ^4.0.17 # 建议使用最新稳定版本

核心实现代码

以下是完整的处理逻辑,包含解码、画框、重新编码、保存全流程:

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

Future<void> processFaceBoxesAndSave(Uint8List imageBytes, List<Rect> faceRects) async {
  // 1. 将Uint8List解码为可编辑的图片对象
  img.Image? editableImage = img.decodeImage(imageBytes);
  if (editableImage == null) {
    throw Exception('图片解码失败');
  }

  // 2. 遍历人脸坐标,绘制红色方框(线条宽度2)
  final boxColor = img.ColorUint8.rgb(255, 0, 0);
  for (final rect in faceRects) {
    // 若人脸检测返回的是比例坐标(0-1范围),需先转换为绝对像素坐标
    final absoluteRect = Rect.fromLTWH(
      rect.left * editableImage.width,
      rect.top * editableImage.height,
      rect.width * editableImage.width,
      rect.height * editableImage.height,
    );

    img.drawRect(
      editableImage,
      x1: absoluteRect.left.toInt(),
      y1: absoluteRect.top.toInt(),
      x2: absoluteRect.right.toInt(),
      y2: absoluteRect.bottom.toInt(),
      color: boxColor,
      thickness: 2,
    );
  }

  // 3. 将编辑后的图片重新编码为Uint8List(这里以PNG为例,也可改用JPG)
  Uint8List editedImageBytes = img.encodePng(editableImage);
  // 若需保存为JPG,可替换为:img.encodeJpg(editableImage, quality: 90)

  // 4. 将处理后的字节数据写入文件保存
  final saveFilePath = '/your/save/path/edited_image.png';
  await File(saveFilePath).writeAsBytes(editedImageBytes);
}

关键说明

  • 坐标适配:如果人脸检测接口返回的是相对比例坐标(如left值为0.1代表距离左边缘10%宽度),必须先乘以图片宽高转换成绝对像素坐标,否则画框位置会出错
  • 编码格式:可根据需求选择PNG(无损)或JPG(压缩),JPG可通过quality参数调整压缩质量(0-100)
  • 无UI特性:全程仅处理字节数据,无需依赖Flutter Widget或任何UI组件,可在后台服务或纯Dart环境中运行

内容的提问来源于stack exchange,提问作者giordy16

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 19:27:08