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

Python实现:将串口ESC/P协议数据转换为BMP图像

解析ESC/P协议数据流并转换为BMP文件的Python实现

我需要从一台适配点阵打印机的设备通过串口接收ESC/P协议数据流,不想使用实体打印机,于是开发了Python程序将该数据流转换为BMP文件供后续使用。网上查找了很久都没找到合适的现成库或解决方案,于是研读ESC/P协议后编写了这个处理程序,现分享出来,期待大家的反馈和改进建议。

from PIL import Image
import struct, io

def parse_ESCP_bytes(data):
    image_list = []

    while data:
        # 查找ESC*指令起始位置
        start_index = data.find(b'\x1b*')
        
        if start_index != -1:
            # 解析列数的高低字节
            num_columns_low, num_columns_high = struct.unpack('>BB', data[start_index+3:start_index+5])
            num_columns = (num_columns_high << 8) + num_columns_low
            
            # 读取图像数据字节
            image_data = struct.unpack('>' + 'B' * num_columns, data[start_index + 5:start_index + 5 + num_columns])
            
            # ESC*图像数据格式说明:每个字节代表一列的8个像素(从上到下对应bit7到bit0)
            # 例如值为7(二进制00000111)表示该列的最下方3个像素被点亮
            for i in range(7, -1, -1):
                image_list.append([col >> i & 1 for col in image_data])
            
            # 截断已处理的数据,继续处理剩余部分
            data = data[start_index + 5 + num_columns + 2:]

            # 暂未处理DPI、走纸、回车等控制指令
        else:
            break
    
    # 确定图像的宽高(注意这里宽高对应行列的转换)
    width, height = len(image_list[0]), len(image_list) if image_list else 0

    # 创建黑白二值图像
    img = Image.new('1', (width, height))

    # 将像素数据写入图像
    img.putdata([int(pixel) for row in image_list for pixel in row])

    img_byte_arr = io.BytesIO()
    img.save(img_byte_arr, format='BMP')
    return img_byte_arr.getvalue()

with open("ESCP", "rb") as file:
    raw_serial = file.read()

image_bytes = parse_ESCP_bytes(raw_serial)

with open("output.bmp", 'wb') as file:
    file.write(image_bytes)

可改进的方向

  • 增加错误处理机制:当前代码默认数据流格式完全合规,实际场景中可能出现数据截断、指令不完整的情况(比如找不到完整的ESC*指令、列数字节不足),建议添加try-except块捕获struct.unpack异常,或提前检查数据长度是否满足解析要求。
  • 扩展指令支持范围:当前仅处理了ESC*位图像打印指令,ESC/P协议还包含ESC G(设置位图像模式)、ESC .(定义下载位图)等图像相关指令,若设备使用这些指令,需要扩展解析逻辑。
  • 处理打印机控制指令:当前忽略了DPI设置、走纸、回车等控制字符,这些指令会影响图像的实际尺寸和分页(比如不同DPI会改变像素密度,走纸操作会分隔不同页面),可以解析这些指令来调整图像的拼接方式或输出尺寸。
  • 优化内存占用:如果数据流过大,image_list会占用较多内存,可考虑分批处理图像数据,边解析边写入图像,避免一次性加载所有像素数据。
  • 验证像素映射逻辑:注释中关于像素位置的描述需要确认是否与设备实际输出一致(比如字节的bit7对应最上方像素还是最下方),避免出现图像上下颠倒的问题。
  • 支持多页面输出:若数据流包含多页内容,当前代码会将所有图像拼接成一张BMP,建议添加分页检测逻辑,将不同页面保存为独立的BMP文件。

内容的提问来源于stack exchange,提问作者Daniel Christen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 03:35:08