使用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é
相关产品推荐
相关产品推荐

