如何不保存到磁盘,使用aiogram处理二维码图片并解析内容
实现无磁盘保存的二维码照片解析
可以直接在内存中处理二维码照片,不用保存到磁盘,下面是具体的修改方案:
错误原因说明
你之前用img = cv2.imread(message.photo[-1])报错,是因为cv2.imread要求传入文件路径字符串,但message.photo[-1]是Telegram的PhotoSize对象,不是路径,所以触发类型错误。
无磁盘处理的实现代码
修改后的代码直接在内存中读取照片数据并解析:
import cv2 import io import numpy as np from pyzbar import pyzbar @dp.message_handler(state=QrScanState.Qr_Scan_Data, content_types=types.ContentType.PHOTO) async def send_qr_data(message: types.Message, state: FSMContext): # 获取清晰度最高的照片对象 photo = message.photo[-1] # 获取Telegram文件实例 file = await bot.get_file(photo.file_id) # 直接将文件下载到内存字节数组,不保存到磁盘 file_bytes = await file.download_as_bytearray() # 将字节数据转换成可读取的流对象 img_stream = io.BytesIO(file_bytes) # 把流数据转换成cv2可处理的numpy数组 img_array = np.asarray(bytearray(img_stream.read()), dtype=np.uint8) img = cv2.imdecode(img_array, cv2.IMREAD_COLOR) # 解析二维码 barcodes = pyzbar.decode(img) # 发送解析结果 if barcodes: await bot.send_message(chat_id=message.from_user.id, text=barcodes[0].data.decode()) else: await bot.send_message(chat_id=message.from_user.id, text="未识别到有效二维码") await state.finish()
关键步骤解析
- 使用
bot.get_file(photo.file_id)获取照片的可下载文件实例 - 通过
download_as_bytearray()直接把文件内容下载到内存,完全跳过磁盘写入 - 借助
io.BytesIO和numpy将字节数据转换成cv2支持的格式,用cv2.imdecode从内存读取图像,替代需要文件路径的cv2.imread
内容的提问来源于stack exchange,提问作者Mr PeDoBeAr11
相关产品推荐
相关产品推荐

