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

使用Flask+pyqrcode+Pillow生成带logo二维码无法重写BytesIO虚拟文件怎么办

问题修复方案

核心错误原因

  • 二维码内容写入BytesIO后,文件指针默认位于内容末尾,直接读取会返回空数据,需要先调用seek(0)重置指针到开头
  • 不能使用open()操作BytesIO对象,该方法仅适用于本地磁盘文件操作
  • 处理完成的Pillow Image对象无法直接传入BytesIO构造函数,需要调用save()方法将图片数据写入缓存

修正后代码

import io
import base64
from PIL import Image

with io.BytesIO() as virtual_file:
    qr.png(
        file=virtual_file, 
        scale=int(scales), 
        module_color=color_hex, 
        background=color_bg_hex, 
        quiet_zone=int(self.quiet_zone)
    )
    # 重置指针到开头才能读取刚写入的二维码内容
    virtual_file.seek(0)
    
    if self.picture is not None:
        qrcode_img = Image.open(virtual_file)
        bord = int(scales) * int(self.quiet_zone)
        position = (
            (qrcode_img.width - self.picture.width - bord), 
            (qrcode_img.height - self.picture.height - bord)
        )
        # 若logo是带透明通道的PNG,需加mask参数避免透明区域变黑:qrcode_img.paste(self.picture, position, mask=self.picture)
        qrcode_img.paste(self.picture, position)
        # 清空原有缓存,写入加了logo的新二维码
        virtual_file.seek(0)
        virtual_file.truncate()
        qrcode_img.save(virtual_file, format='PNG')
    
    virtual_file.seek(0)
    image_as_str = base64.b64encode(virtual_file.getvalue()).decode("ascii")        
    return image_as_str

补充说明:如果需要logo居中显示,把position的计算逻辑改为((qrcode_img.width - self.picture.width)//2, (qrcode_img.height - self.picture.height)//2)即可

内容的提问来源于stack exchange,提问作者POIROT Cloé

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 07:06:14