Python中无需本地存储即可查看SQLite BLOB字段存储图像的实现方法
无需生成本地文件的SQLite图像BLOB读写方案
写入阶段:直接把内存中的图像转二进制写入
不管你的图像是来自内存生成、相机实时捕获、网络下载,都不需要先存到本地磁盘,直接转成二进制流就能写入SQLite的BLOB字段:
- PIL Image对象写入示例:
import sqlite3 from io import BytesIO from PIL import Image # 这里是你内存中的任意PIL图像对象,不需要提前存本地 img = Image.new('RGB', (100, 100), color='red') # 直接在内存中转二进制 byte_buffer = BytesIO() img.save(byte_buffer, format='PNG') img_blob = byte_buffer.getvalue() # 写入数据库 conn = sqlite3.connect('project.db') cursor = conn.cursor() cursor.execute("CREATE TABLE IF NOT EXISTS image_store (id INTEGER PRIMARY KEY AUTOINCREMENT, img_blob BLOB)") cursor.execute("INSERT INTO image_store (img_blob) VALUES (?)", (img_blob,)) conn.commit() conn.close()
- OpenCV Mat对象写入示例:
import sqlite3 import cv2 import numpy as np # 这里是你内存中的任意OpenCV图像对象,不需要提前存本地 img = np.zeros((100,100,3), np.uint8) cv2.rectangle(img, (20,20), (80,80), (0,255,0), 2) # 直接在内存中编码为二进制 _, encode_img = cv2.imencode('.png', img) img_blob = encode_img.tobytes() # 后续写入数据库逻辑和上面一致
读取阶段:直接加载二进制数据预览,不生成本地文件
从数据库读取出BLOB二进制数据后,直接在内存中转为图像对象即可预览,完全不需要落地到磁盘:
- 用PIL直接查看示例:
import sqlite3 from io import BytesIO from PIL import Image conn = sqlite3.connect('project.db') cursor = conn.cursor() cursor.execute("SELECT img_blob FROM image_store WHERE id = 1") img_blob = cursor.fetchone()[0] conn.close() # 直接从二进制加载图像并展示,无本地文件生成 img = Image.open(BytesIO(img_blob)) img.show()
- 用OpenCV直接查看示例:
import sqlite3 import cv2 import numpy as np conn = sqlite3.connect('project.db') cursor = conn.cursor() cursor.execute("SELECT img_blob FROM image_store WHERE id = 1") img_blob = cursor.fetchone()[0] conn.close() # 直接从二进制加载为OpenCV图像并展示,无本地文件生成 img_arr = np.frombuffer(img_blob, np.uint8) img = cv2.imdecode(img_arr, cv2.IMREAD_COLOR) cv2.imshow("DB Image", img) cv2.waitKey(0) cv2.destroyAllWindows()
整个流程所有数据都在内存中流转,不会产生任何临时文件,也不存在数据冗余存储的问题
内容的提问来源于stack exchange,提问作者DarkJeslek
相关产品推荐
相关产品推荐

