87 lines
2.6 KiB
Python
87 lines
2.6 KiB
Python
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
|