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 osimport sqlite3import cv2def 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