【发布时间】:2020-05-03 03:45:38
【问题描述】:
用户写入屏幕并创建图像并发送到我们的平台。每张图片都是用白色背景拍摄的某物(手写文字)的图片。我想删除图像的所有白色部分以获取仅用户写入的内容。是否可以在颤振中使用图像处理?如果可能怎么做?
【问题讨论】:
-
您的意思是要删除所有背景,还是只修剪多余的空白?
标签: image flutter image-processing dart transparency
用户写入屏幕并创建图像并发送到我们的平台。每张图片都是用白色背景拍摄的某物(手写文字)的图片。我想删除图像的所有白色部分以获取仅用户写入的内容。是否可以在颤振中使用图像处理?如果可能怎么做?
【问题讨论】:
标签: image flutter image-processing dart transparency
你可以在 Dart 中进行图像处理(Flutter 只是一个 UI 框架,图像处理是一种算法,所以与 UI 无关,而与语言本身有关)。
您可以尝试使用image 包,打开图像,解码其字节并在其中应用任何图像处理算法。
这个库将帮助您提取图像字节,但如果您需要更多核心图像处理算法,例如 OpenCV 中的算法,并且您不太热衷于自己实现它们,您可能需要执行一些操作,例如:
在 pub.dev 中测试 Flutter/Dart 的任何 OpenCV 包。我不能推荐任何,因为我从未使用过它们。
使用方法通道调用与本地平台(Android/iOS)的 OpenCV 库进行交互,传递图像并在此处处理,然后将其返回给 Flutter。
不理想,但完全可行。
【讨论】:
首先需要安装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
【讨论】: