You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Flutter开发POS系统时打印图片出现逐行显示异常的问题

问题根因

你遇到的逐行偏移错位问题,本质是热敏小票打印机的图像数据格式要求没满足:绝大多数58/80mm热敏打印机要求图像每行像素宽度必须是8的整数倍(每字节对应8个打印点),原始图片宽度不符合该规则时,就会出现每行数据错位累加的异常效果。

修复方案

1. 先确认适配的小票打印宽度

常用小票对应可打印像素宽度为:

  • 58mm小票:384像素
  • 80mm小票:576像素

2. 预处理图片调整到符合对齐要求

在调用打印生成器的image方法前,先把图片调整为宽度是8的整数倍,你可以选择保持比例缩放,或者补白到目标宽度:

import 'package:image/image.dart' as img;

final ByteData data = await rootBundle.load('assets/logo1.png');
final Uint8List buffer = data.buffer.asUint8List();
final img.Image? originalImage = img.decodeImage(buffer);
if (originalImage == null) return;

// 方案1:直接缩放到适配小票宽度(推荐,避免留白过多)
int targetWidth = 384; // 58mm小票用384,80mm替换为576
// 方案2:仅补白到8的整数倍,保留原始尺寸
// int targetWidth = (originalImage.width + 7) ~/ 8 * 8;

// 调整图片尺寸
final img.Image adjustedImage = img.copyResize(originalImage, width: targetWidth);

// 传入处理后的图片打印
bytes += generator.image(adjustedImage);

3. 可选二值化优化(如果仍有打印异常)

部分打印库要求输入纯黑白二值图,避免灰度识别异常,可增加二值化处理逻辑:

// 基于亮度转纯黑白二值图
final img.Image binaryImage = img.grayscale(adjustedImage);
for (int y = 0; y < binaryImage.height; y++) {
  for (int x = 0; x < binaryImage.width; x++) {
    int luminance = img.getLuminance(binaryImage.getPixel(x, y));
    binaryImage.setPixel(x, y, luminance > 128 ? img.ColorRgb8(255,255,255) : img.ColorRgb8(0,0,0));
  }
}
bytes += generator.image(binaryImage);

内容的提问来源于stack exchange,提问作者Jian Yuan Ng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:15:02