【问题标题】:How to remove surrounding whitespace from an Image in Dart Flutter?如何从 Dart Flutter 中的图像中删除周围的空白?
【发布时间】:2020-05-03 03:45:38
【问题描述】:

用户写入屏幕并创建图像并发送到我们的平台。每张图片都是用白色背景拍摄的某物(手写文字)的图片。我想删除图像的所有白色部分以获取仅用户写入的内容。是否可以在颤振中使用图像处理?如果可能怎么做?

【问题讨论】:

  • 您的意思是要删除所有背景,还是只修剪多余的空白?

标签: image flutter image-processing dart transparency


【解决方案1】:

你可以在 Dart 中进行图像处理(Flutter 只是一个 UI 框架,图像处理是一种算法,所以与 UI 无关,而与语言本身有关)。

您可以尝试使用image 包,打开图像,解码其字节并在其中应用任何图像处理算法。

这个库将帮助您提取图像字节,但如果您需要更多核心图像处理算法,例如 OpenCV 中的算法,并且您不太热衷于自己实现它们,您可能需要执行一些操作,例如:

  1. 在 pub.dev 中测试 Flutter/Dart 的任何 OpenCV 包。我不能推荐任何,因为我从未使用过它们。

  2. 使用方法通道调用与本地平台(Android/iOS)的 OpenCV 库进行交互,传递图像并在此处处理,然后将其返回给 Flutter。

不理想,但完全可行。

【讨论】:

    【解决方案2】:

    首先需要安装Image

    然后使用下面的代码去除背景

    import 'package:image/image.dart' as Img;
    
    Future<Uint8List> removeWhiteBackgroundFromImage(
        Uint8List bytes) async {
      Img.Image image = Img.decodeImage(bytes);
      Img.Image transparentImage = await _colorTransparent(image, 255, 255, 255);
      var newPng = Img.encodePng(transparentImage);
      return newPng;
    }
    
    Future<Img.Image> _colorTransparent(
        Img.Image src, int red, int green, int blue) async {
      var pixels = src.getBytes();
      for (int i = 0, len = pixels.length; i < len; i += 4) {
        if (pixels[i] == red && pixels[i + 1] == green && pixels[i + 2] == blue) {
          pixels[i + 3] = 0;
        }
      }
    
      return src;
    }
    

    注意:如果要将图像转换为 Uint8List,请使用以下代码

    Uint8List imageBytes = File(imageFilePath).readAsBytesSync();
    

    参考链接:https://gist.github.com/plateaukao/ebb5e7169dd89cc52bda338762d4997e

    【讨论】: