尝试检索和显示在猕猴桃核心图像中时出现UnicodeDecodeError

时间:2018-08-07 14:04:41

标签: python image unicode sqlite kivy

代码检索图像数据并打印,代码的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

我无法理解此错误的原因。感谢您的帮助,并期待您的投入。

1 个答案:

答案 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])