Python 存储图片到sqlite3中

Python 把图片转化为blob格式存储到sqlite3数据库中并读取

应用场景:

SQLite是一个开源的嵌入式关系数据库,它在2000年由D. Richard Hipp发布,它的减少应用程序管理数据的开销,SQLite可移植性好,很容易使用,很小,高效而且可靠。
SQLite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程。从外部看,它并不像一个RDBMS,但在进程内部,它却是完整的,自包含的数据库引擎。

每个存储在 SQLite 数据库中的值都具有以下存储类之一:
存储类 描述
NULL 值是一个 NULL 值。
INTEGER 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。
REAL 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。
TEXT 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
BLOB 值是一个 blob 数据,完全根据它的输入存储。

在轻量级数据库sqlit中,图片的读取一般是使用图片的地址。例如:path = ‘/image.jpg’
然后把这个路径保存在数据库中,下次加载的时候就可以读取路径后显示。 但这也带来一个问题,如果保存图片的文件夹被破坏,或者文件名发生改变时,就会出现问题。

我选择把一些不大的图片,转化成blob格式放入数据库中,只要数据库存在,这些图片就不会被破坏。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import os
import sqlite3
import cv2

def get_conn(path):
'''连接到数据库,如果文件路径存在则连接,如果不存在,则报错'''
if os.path.exists(path) and os.path.isfile(path):
conn = sqlite3.connect(path)
print('成功连接到[{}]的数据库'.format(path))
return conn
else:
print('打开错误,请检查路径')

def insert_image_db(MapId,image):
sql_path = "test.db"
conn = get_conn(sql_path)
img_blob = sqlite3.Binary(image)
""" 目的是把image转化成blob格式,然后保存到sql中"""
try:
conn.execute("INSERT INTO MAP (MapId,Image) VALUES(?,?);",(MapId,img_blob))
conn.commit()
conn.close()
except IOError:
print ("写入数据库失败")
conn.close()

def retrieve_image_db(MapId):
sql_path = "test.db"
conn = get_conn(sql_path)
cursor = conn.cursor()
""" 读取存在数据库中的blob格式图片"""
try:
sqli = "SELECT Image FROM MAP WHERE MapId = :mapid"
param = {'mapid':MapId}
cursor.execute(sqli,param)
image = cursor.fetchone()
image = np.array(image[0])
conn.close()
return image
except IOError:
print ("读取数据库失败")
conn.close()

"""测试"""

image_path = "image.jpg"
MapId = "20160502"
image = cv2.imread(image_path)
insert_image_db(MapId,image)
img = retrieve_image_db(MapId)
"""读取到的是没有变形过的数据"""
img = img.reshape(image.shape)

总结:

具体的sqlite介绍和分析,可参考以下内容
http://www.cnblogs.com/hustcat/archive/2009/02/12/1389448.html