我想显示我已经保存在表格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()
答案 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()