代码之家  ›  专栏  ›  技术社区  ›  Berch

尝试在Kivy核心图像中检索和显示时出现单代码解码错误

  •  0
  • Berch  · 技术社区  · 6 年前

    代码检索图像数据并打印,代码抛出的步骤2部分 UnicodeDecodeError . 在步骤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

    • 操作系统:窗口

    回溯错误:

    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 回复  |  直到 6 年前
        1
  •  1
  •   lenz    6 年前

    第一个论点 open 应为 文件名 (或一个文件描述符),但您正在给它 图像数据 .

    我有点猜测,但这是我唯一能想到的解释。 在程序的步骤1中,从数据库中检索图像blob,并将其分配给变量 image . 自从 sqlite 给你一行一个字段,你写 image[0] 访问它。

    代码中的一条注释表示,打印时会看到一个“图像字节流”,但我敢肯定 SQLite 直接返回数据(字节),而不是通过提供文件句柄。 所以我想你看到的是:

    b'\x89z~fI\xa4j7&8\x00\xaf...'
    

    这就是你传递给 打开 打电话。 从变量名判断( image_loci )似乎你认为这是指向文件句柄的某种指针,但正如我所说,我确信你是错的。 python现在尝试对图像进行解码,因为它假定它是一个路径字符串,但当然失败了,因为这不是utf-8编码的文本。

    现在怎么办?_ 打开 呼叫,数据已经存在。 把它们包起来 BytesIO 对象:

    # Step 2.
    data = io.BytesIO(image[0])