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

如何不保存到磁盘,使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:45:38