首页 > 解决方案 > 如何从 Flutter 中的图像中获取 RGB 值?

问题描述

我正在为我的对象检测服务器创建一个移动客户端。我已经有一个运行良好的 python 客户端,它将图像作为输入,通过 HTTP 请求将其发送到服务器,并以 json 响应的形式接收预测。我试图在我相当新的 Dart 中实现同样的目标。

我的 python 代码将输入的 JPG 图像转换为以下格式的 RGB 值的 numpy 数组(以 5x4 图像为例)-

[
[[182, 171, 153], [203, 188, 169], [242, 214, 200], [255, 235, 219], [155, 111, 98]],
[[181, 171, 146], [204, 190, 164], [255, 237, 214], [177, 142, 120], [84, 42, 20]], 
[[176, 168, 129], [218, 206, 166], [180, 156, 118], [91, 59, 21], [103, 64, 25]],
[[186, 180, 132], [166, 156, 107], [91, 68, 24], [94, 63, 17], [122, 84, 39]]
]

在我的飞镖代码中,我尝试将图像转换为 8 位无符号整数列表,使用 -

Uint8List inputImg = (await rootBundle.load("assets/test.jpg")).buffer.asUint8List()

对于同一张 5x4 图像,它为我提供了超过 800 个整数的长数组。

在使用两个单像素图像(一个黑色和一个白色)对其进行测试时,Uint8List 的大部分似乎都在重复。我隔离了数组的不同部分,它们与颜色的预期 RGB 值不对应(我预期 [0 0 0] 和 [255 255 255],但得到了类似 255、0、63、250、0、 255, 0 和 254, 254, 40, 3 分别代表两者)

我只需要图像中的 RGB 值。将不胜感激有人指出我正确的方向!

标签: flutterdart

解决方案


图像在存储时通常会被压缩。根据文件扩展名,我猜您使用的是 JPEG 编码。这意味着存储在assets/test.jpg文件中的数据不是颜色数组。如果一切都以这种方式完成,那将是对数据存储的低效使用。要获得该颜色数组,您需要对图像进行解码。这可以通过图像包来完成。

为此,首先将包添加为依赖项,方法是将以下内容添加到pubspec.yaml

dependencies:
  image: ^3.0.4

您应该遵循获取编码图像数据的相同方法。但是您随后需要对其进行解码。

final Uint8List inputImg = (await rootBundle.load("assets/test.jpg")).buffer.asUint8List();
final decoder = JpegDecoder();
final decodedImg = decoder.decodeImage(inputImg);
final decodedBytes = decodedImg.getBytes(format: Format.rgb);

decodedBytes包含 RGB 格式的所有像素值的单个深度列表。要将其转换为您想要的格式,只需遍历这些值并将它们添加到新列表中。

List<List<List<int>> imgArr = [];
for(int y = 0; y < decodedImage.height; y++) {
  imgArr.add([]);
  for(int x = 0; x < decodedImage.width; x++) {
    int red = decodedBytes[y*decodedImage.width*3 + x*3];
    int green = decodedBytes[y*decodedImage.width*3 + x*3 + 1];
    int blue = decodedBytes[y*decodedImage.width*3 + x*3 + 2];
    imgArr[y].add([red, green, blue]);
  }
}

推荐阅读