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

iOS设备热敏POS打印图片仅显示一半的问题求助

iOS热敏POS打印图片仅显示一半的修复方案

问题情况

使用热敏POS设备打印图片时,Android端能完整显示图片,但iOS端仅能打印出图片上半部分,下半部分缺失。

用到的依赖包

  • print_bluetooth_thermal
  • esc_pos_utils_plus
  • widgets_to_image

原代码

final Uint8List? imageBytes = await controller.capture(pixelRatio: 1);
final profile = await CapabilityProfile.load();
final generator = Generator(PaperSize.mm58, profile);

List<int> bytes = [];
bytes += generator.reset();

var image = img.decodeImage(imageBytes);

if (Platform.isIOS) {
      final resizedImage = img.copyResize(image!, width: image.width ~/ 1.3, height: image.height ~/ 1.3, interpolation: img.Interpolation.nearest);
      final byteString = Uint8List.fromList(img.encodeJpg(resizedImage));
      image = img.decodeImage(byteString);
      bytes += generator.imageRaster(image!,align: PosAlign.center);
}else{
      bytes +=generator.imageRaster(image!);
}
bytes += generator.feed(2);

var printing = await PrintBluetoothThermal.writeBytes(bytes);
print(printing); // 无任何输出

问题原因及修复方法

1. 图片缩放比例未适配纸张宽度

58mm热敏纸的标准打印宽度为384像素,当前用width ~/1.3的比例缩放无法精准匹配该宽度,导致图片超出打印区域被截断。

修复代码:
直接按纸张最大宽度固定缩放,高度按比例计算:

if (Platform.isIOS) {
  const maxPrintWidth = 384; // 58mm热敏纸对应标准打印像素宽度
  final scaleRatio = maxPrintWidth / image!.width;
  final resizedImage = img.copyResize(
    image,
    width: maxPrintWidth,
    height: (image.height * scaleRatio).toInt(),
    interpolation: img.Interpolation.lanczos3, // 提升缩放清晰度
  );
  bytes += generator.imageRaster(resizedImage, align: PosAlign.center);
} else {
  bytes += generator.imageRaster(image!);
}

2. 多余的JPG编解码导致数据异常

iOS端额外执行的JPG编码再解码操作,可能在压缩过程中丢失部分像素数据,引发打印截断。

修复代码:
移除不必要的编解码步骤,直接使用缩放后的图片:

if (Platform.isIOS) {
  const maxPrintWidth = 384;
  final scaleRatio = maxPrintWidth / image!.width;
  final resizedImage = img.copyResize(
    image,
    width: maxPrintWidth,
    height: (image.height * scaleRatio).toInt(),
  );
  bytes += generator.imageRaster(resizedImage, align: PosAlign.center);
} else {
  bytes += generator.imageRaster(image!);
}

3. 蓝牙传输可能存在字节截断

iOS端蓝牙打印的字节流传输可能出现截断,可通过日志排查字节流是否正常,同时尝试替换打印方法测试。

修复代码:
添加日志确认字节流长度,替换打印方法测试:

// 打印字节流长度排查问题
print('生成的打印字节流长度: ${bytes.length}');
var printing = await PrintBluetoothThermal.writeBytes(bytes);
print('打印结果: $printing');

// 替换为image方法测试
bytes += generator.image(resizedImage, align: PosAlign.center);

验证步骤

  1. 替换代码后重新打包iOS设备测试
  2. 确认图片宽度严格匹配384像素
  3. 查看打印日志是否存在错误提示

内容的提问来源于stack exchange,提问作者Dara Vichit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:34:58