如何将图片转为适配Spire.Barcode ScanStream的Stream?
解决方案
问题出在Spire.Barcode的ScanStream方法需要的是**.NET原生的Stream对象**,而非Python的_io.BytesIO。因为Spire.Barcode for Python底层基于.NET框架,所以必须用兼容的.NET流类型来传递图片数据。
以下是实现单加载图片、同时完成条码扫描和UI图片处理的代码:
前置准备
先安装依赖的pythonnet库(用于在Python中调用.NET类型):
pip install pythonnet
完整代码示例
import spire.Barcode as spire from PIL import Image import io import clr from System.IO import MemoryStream def process_single_image(image_path): barcode = None ui_image = None try: # 仅加载一次图片到PIL with Image.open(image_path) as img: # 1. 将PIL图片转为字节,包装成.NET MemoryStream供Spire扫描 img_buffer = io.BytesIO() img.save(img_buffer, format=img.format) img_bytes = img_buffer.getvalue() # 创建.NET MemoryStream(Spire兼容的流类型) net_stream = MemoryStream(bytearray(img_bytes)) net_stream.Position = 0 # 重置流指针到起始位置 # 调用Spire的扫描方法 barcode_result = spire.BarcodeScanner.ScanStreamWithBarCodeType(net_stream, spire.BarCodeType.Code39) if barcode_result and barcode_result[0] is not None: barcode = barcode_result[0] # 2. 调整图片尺寸用于UI展示 # 根据你的UI需求设置目标尺寸,示例为800x600 ui_image = img.resize((800, 600)) # 可选:将调整后的图片转为内存字节(如果UI需要字节数据) # ui_buffer = io.BytesIO() # ui_image.save(ui_buffer, format='PNG') # ui_image_data = ui_buffer.getvalue() except Exception as e: print(f"处理图片 '{image_path}' 出错: {e}") finally: # 释放.NET流资源 if 'net_stream' in locals(): net_stream.Dispose() return barcode, ui_image
关键说明
- 使用PIL一次性加载图片,既用于提取字节流给Spire扫描,又用于调整UI展示尺寸,避免重复读取文件。
- 用
.NET MemoryStream替代Python的BytesIO,满足Spire.Barcode对输入流的类型要求,解决'_io.BytesIO' object has no attribute 'Ptr'错误。 - 扫描完成后记得调用
Dispose()释放.NET流资源,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Nathan Lee
相关产品推荐
相关产品推荐

