import time from machine import UART from config import ttl_tx, ttl_rx from printer_driver import TsplPrinter def print_bitmap(printer, data, width, height, x_offset=0, y_offset=0, invert=False): """ 发送位图数据到打印机 :param printer: TsplPrinter 对象 :param data: 位图数据 (bytes), 每一位代表一个像素 (1=print/黑, 0=no print/白) :param width: 图像宽度 (dots) :param height: 图像高度 (dots) :param x_offset: X轴偏移 :param y_offset: Y轴偏移 :param invert: 是否反色打印 (默认False) """ if invert: # 反转每一个字节 data = bytearray([~b & 0xFF for b in data]) width_bytes = (width + 7) // 8 # TSPL BITMAP 指令 # BITMAP x, y, width_bytes, height, mode, data # mode=0: 正常模式 header = f"BITMAP {x_offset},{y_offset},{width_bytes},{height},0,".encode('utf-8') printer.uart.write(header) # 分段发送数据,防止串口缓冲区溢出 chunk_size = 128 for i in range(0, len(data), chunk_size): printer.uart.write(data[i : i + chunk_size]) # 简单的流控,防止发送太快 time.sleep(0.005) printer.uart.write(b'\r\n') def print_raw_image_file(file_path, width, height): """ 直接打印存储在文件系统中的原始位图数据 (.bin) 该文件应包含预处理好的二进制像素数据 (1 bit per pixel) :param file_path: 文件路径 :param width: 图片宽度 (dots) :param height: 图片高度 (dots) """ try: with open(file_path, 'rb') as f: data = f.read() except OSError: print(f"错误: 无法打开文件 {file_path}") return # 初始化打印机 uart = UART(1, baudrate=115200, tx=ttl_tx, rx=ttl_rx) printer = TsplPrinter(uart) print("=== 开始打印图片 ===") # 基础设置 printer.cls() printer.size(48, 30) # 默认 48x30mm printer.gap(2, 0) # 计算居中位置 (假设标签纸最大宽度 384 dots, 高度 240 dots) MAX_WIDTH = 384 MAX_HEIGHT = 240 x_offset = (MAX_WIDTH - width) // 2 y_offset = (MAX_HEIGHT - height) // 2 if x_offset < 0: x_offset = 0 if y_offset < 0: y_offset = 0 print(f"正在发送图片数据 ({len(data)} bytes)...") print_bitmap(printer, data, width, height, x_offset, y_offset) # 打印出纸 printer.print_out(1) print("打印完成") # 示例用法 if __name__ == "__main__": # 假设有一个预处理好的 384x240 的二进制文件 # print_raw_image_file("image_data.bin", 384, 240) pass