为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

月关宝盒 2022-05-19 15:36:38
我正在编写代码以使用 ESC * 命令(使用 ESC POS 热敏收据打印机)打印图像。基本上,我正在尝试为 Dart/Flutter 调整 Python 算法。听起来很简单:打开图像 -> 灰度 -> 反转颜色 -> 转换为黑白 1 位:im = Image.open(filename)im = im.convert("L")  # Invert: Only works on 'L' imagesim = ImageOps.invert(im)  # Bits are sent with 0 = white, 1 = black in ESC/POSprint(len(im.tobytes())) # len = 576 (image size: 24*24)im = im.convert("1")  # Pure black and whiteprint(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 字节?
查看完整描述

1 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

遍历 576 个灰度字节,将每个字节与阈值进行比较,并将这些位打包成字节(或者更方便的是整数)。


这是一个使用 的帮助函数的示例package:raw,但您可以将其内联,因为它相对简单。


  Uint8List img24x24 = Uint8List(24 * 24); // input 24x24 greyscale bytes [0-255]

  Uint32List img24 = Uint32List(24); // output 24 packed int with 24 b/w bits each

  final threshold = 127; // set the greyscale -> b/w threshold here

  for (var i = 0; i < 24; i++) {

    for (var j = 0; j < 24; j++) {

      img24[i] = transformUint32Bool(

        img24[i],

        24 - j,

        img24x24[i * 24 + j] > threshold, // or < threshold to do the invert in one step

      );

    }

  }


查看完整回答
反对 回复 2022-05-19
  • 1 回答
  • 0 关注
  • 399 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信