代码检索图像数据并打印,代码的STEP 2部分抛出UnicodeDecodeError
。在STEP 3中,检索到的图像必须显示在kivy coreimage小部件上。
def populate_fields(self, instance): # NEW
# Code retrieves text data and display in textinput fields here.
.....
.......
# STEP 1: RETRIEVE IMAGE
connection = sqlite3.connect("demo.db")
with connection:
cursor = connection.cursor()
cursor.execute("SELECT UserImage from Users where
UserID=?",self.data_items[columns[0]]['text'] )
image = cursor.fetchone()
print(image[0])
# Retrieve operation works as a image byte stream is printed as output.
# STEP 2: CONVERT BLOB TO COREIMAGE
image_loci = image[0]
data = io.BytesIO(open(image_loci, 'rb').read())
#image opened in binary mode
im = CoreImage(data, ext="png")
#STEP 3: SET OUTPUT TO IMAGE WIDGET
self.image.source = im
数据库:Sqlite3
表名:用户
列:UserID,UserName,UserImage
操作系统:Windows
回溯错误:
data = io.BytesIO(open(image_loci, 'rb').read()) #image opened in binary mode UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
我无法理解此错误的原因。感谢您的帮助,并期待您的投入。
答案 0 :(得分:1)
open
的第一个参数应该是文件名(或文件描述符),但是您要赋予它图像数据。>
我有点猜测,但这是我能想到的唯一解释。
在程序的步骤1中,您从数据库中检索图像Blob,并将其分配给变量image
。
由于sqlite
为您提供了一个字段的行,因此您编写image[0]
即可访问它。
代码中的注释说,打印时会看到“图像字节流”,但是我很确定sqlite
直接返回数据(字节),而不是通过提供文件句柄。
所以我想你会看到类似的东西:
b'\x89z~fI\xa4j7&8\x00\xaf...'
现在,这就是您传递给open
调用的内容。
从变量名(image_loci
)来看,您似乎认为这是某种指向文件句柄的指针,但是正如我所说,我很确定您对此有误。
Python现在尝试解码图像,因为它假定它是路径字符串,但是它当然会失败,因为它不是UTF-8编码的文本。
现在该怎么办? –忽略open
调用,数据已经存在。
只需将它们包装在BytesIO
对象中即可:
# Step 2.
data = io.BytesIO(image[0])