Flutter / Dart:将图像转换为 1 位黑白

我正在编写代码以使用 ESC * 命令(使用 ESC POS 热敏收据打印机)打印图像。


基本上,我正在尝试为 Dart/Flutter 调整 Python 算法。听起来很简单:打开图像 -> 灰度 -> 反转颜色 -> 转换为黑白 1 位:


im = Image.open(filename)

im = im.convert("L")  # Invert: Only works on 'L' images

im = ImageOps.invert(im)  # Bits are sent with 0 = white, 1 = black in ESC/POS


print(len(im.tobytes())) # len = 576 (image size: 24*24)

im = im.convert("1")  # Pure black and white

print(len(im.tobytes())) # leng = 72 (image size: 24*24)

...

我只有最后一步(1位转换)有问题。


如您所见,Python 代码(Pillow 库)将减少 im.convert("1") 命令后的字节数,这正是我正确生成 ESC/POS 命令所需要的。每个值都在 0 到 255 之间。


如何使用 Dart 实现它?


这是我的代码:


import 'package:image/image.dart';


const String filename = './test_24x24.png';

final Image image = decodeImage(File(filename).readAsBytesSync());


grayscale(image);

invert(image);


源图片:24px * 24px


最后,我在 RGB 模式下有一个包含 (24 * 24 * 3) 字节的灰色/反转图像。由于灰度,所有的 r/g/b 值都是相等的,所以我只能保留一个给我 (24 * 24) 字节的通道。


如何实现最后一步im.convert("1")并仅保留 24 * 3 字节?


月关宝盒
浏览 400回答 1
1回答

UYOU

遍历 576 个灰度字节,将每个字节与阈值进行比较,并将这些位打包成字节(或者更方便的是整数)。这是一个使用 的帮助函数的示例package:raw,但您可以将其内联,因为它相对简单。&nbsp; Uint8List img24x24 = Uint8List(24 * 24); // input 24x24 greyscale bytes [0-255]&nbsp; Uint32List img24 = Uint32List(24); // output 24 packed int with 24 b/w bits each&nbsp; final threshold = 127; // set the greyscale -> b/w threshold here&nbsp; for (var i = 0; i < 24; i++) {&nbsp; &nbsp; for (var j = 0; j < 24; j++) {&nbsp; &nbsp; &nbsp; img24[i] = transformUint32Bool(&nbsp; &nbsp; &nbsp; &nbsp; img24[i],&nbsp; &nbsp; &nbsp; &nbsp; 24 - j,&nbsp; &nbsp; &nbsp; &nbsp; img24x24[i * 24 + j] > threshold, // or < threshold to do the invert in one step&nbsp; &nbsp; &nbsp; );&nbsp; &nbsp; }&nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python