Python中使用SQLite3存储图片后查询显示二进制而非图片怎么解决?
解决SQLite读取图片后无法显示的问题
嘿,你现在看到的输出是图片的二进制字节数据,这很正常——因为你只是把数据库里的字节直接打印出来了,并没有把它转换成可显示的图片格式😉。下面给你两种简单的解决方法:
方法1:把二进制数据写回文件再打开
这种方法是把从数据库读取到的字节重新写入一个图片文件,然后用系统默认的图片查看器打开它:
import sqlite3 import os # 用来打开文件 conn = sqlite3.connect('Pictures.db') cur = conn.cursor() # 注意:如果已经运行过一次创建表和插入数据的代码,建议注释掉下面两行避免报错 # cur.execute('create table pictures(thebin blob)') # with open('logo4.png', 'rb') as file: # cur.execute('insert into pictures(thebin) values (?)', [sqlite3.Binary(file.read())]) # conn.commit() # 插入数据后必须提交才能保存到数据库 # 读取图片二进制数据 cur.execute('select thebin from pictures') img_data = cur.fetchone()[0] # fetchone返回元组,取第一个元素就是图片字节 # 将字节写入新的图片文件 with open('recovered_logo.png', 'wb') as f: f.write(img_data) # 调用系统默认程序打开图片 os.startfile('recovered_logo.png') # Windows系统适用;macOS可替换为 subprocess.run(['open', 'recovered_logo.png']) conn.close()
方法2:用Pillow库直接在内存中显示图片
如果你不想生成中间文件,可以用Pillow(Python常用图像处理库)直接加载内存中的二进制数据并显示:
首先安装Pillow:
pip install pillow
然后修改代码:
import sqlite3 from PIL import Image from io import BytesIO conn = sqlite3.connect('Pictures.db') cur = conn.cursor() # 读取图片数据 cur.execute('select thebin from pictures') img_data = cur.fetchone()[0] # 在内存中加载图片并调用系统查看器显示 img = Image.open(BytesIO(img_data)) img.show() conn.close()
小提醒
- 重复运行插入数据的代码会导致数据库里存入多张相同图片,读取时
fetchone()只会取第一条,记得按需注释插入逻辑。 conn.commit()一定要放在插入数据之后,否则数据不会真正保存到数据库中。
内容的提问来源于stack exchange,提问作者ronak patel
相关产品推荐
相关产品推荐

