如何使用python从mysql数据库显示图片?

时间:2017-08-22 10:11:05

标签: mysql python-2.7 python-imaging-library pillow

我想显示我已经保存在表格img上的图片,但它给了我一个错误

  

无法识别图像文件

尝试打开file_like时。 游标和连接使用mysql数据库的连接和密码。 使用以下代码我想显示图片。它有什么问题,还是有更好/更简单的方式?

sql1='select * from img'
connection.commit()
cursor.execute(sql1)
data2=cursor.fetchall()

file_like=cStringIO.StringIO(data2[0][0])

img1=PIL.Image.open(file_like,mode='r').convert('RGB')
img1.show()
cursor.close()

2 个答案:

答案 0 :(得分:3)

使用io.BytesIO代替cstringIO时,它可以正常工作,也无需解码和编码。我还将类型从blob更改为mediumblob,这允许更大的图片。

import pymysql
import io
from PIL import Image

connection=pymysql.connect(host="localhost",
                 user="root",
                 passwd="root",
                 db="test")
cursor=connection.cursor()
sql1 = 'select * from table'
cursor.execute(sql1)
data2 = cursor.fetchall()

file_like2 = io.BytesIO(data2[0][0])

img1=Image.open(file_like2)
img1.show()
cursor.close()
connection.close()

答案 1 :(得分:0)

我测试了你的代码并得到了同样的错误。所以首先我将图像保存到我的数据库中。当我保存它时,我使用了base64编码,然后在我尝试阅读时遇到了同样的错误。为了保存,我使用了Inserting and retrieving images into mysql through python中的代码,您的代码也看起来就像是从同一个问题/答案中得到的。

在这种情况下,解决方案很简单。你必须解码数据,这是另一个答案中缺少的部分。 那么base64.b64decode(data2[0][0])

import MySQLdb
import base64
from PIL import Image
import cStringIO

db = MySQLdb.connect(host="localhost",
                     user="root",
                     passwd="root",
                     db="test")
# select statement with explicit select list and where clause instead of select * ...
sql1='select img from images where id=1'  
cursor = db.cursor()
cursor.execute(sql1)
data2=cursor.fetchall()
cursor.close()
db.close()

file_like=cStringIO.StringIO(base64.b64decode(data2[0][0]))

img1=Image.open(file_like,mode='r').convert('RGB')
img1.show()