简体   繁体   中英

InterfaceError: Error binding parameter 4 - probably unsupported type.for image and blob image does not display on QTLabel

from PyQt5.QtWidgets import *
from PyQt5 import QtWidgets, QtGui

from PIL import Image, ImageQt    
import cv2 as cv
img =  cv.imread('1.1 cat.jpeg.jpeg')
im = Image.fromarray(img)
im.save('file.png')

con = lite.connect('Final_Avirs.db')
cur = con.cursor()
def createtb():
    queryveh = """CREATE TABLE IF NOT EXISTS VehicleTB(Scan_DI  INTEGER PRIMARY KEY NOT NULL UNIQUE,
    Vehicle_number  TEXT NOT NULL, Vehicle_type TEXT NOT NULL, Cam_loc  TEXT NOT NULL, Date_Time    TEXT NOT NULL, 
    Vehicle_number_pic BLOB NOT NULL) """
 

    cur.execute(queryveh)
    con.commit()

def vehicledetailsquery(vn, vt, cl, dt, vnp):
    scan_id = vn + "1"
    query = " INSERT INTO 'VehicleTB' ( Vehicle_number, Vehicle_type, Cam_loc, " \
            "Date_Time, Vehicle_number_pic ) VALUES( ?, ?, ?, ?, ?)"
    cur.execute(query, (vn, vt, cl, dt, vnp))
    con.commit()
    
img = Image.open('file.png')
createtb()

vehicledetailsquery('aswe23','2039230', 'cam-2', '23343', img )

app = QtWidgets.QApplication([])
def vehicletbquery():
    query = "SELECT * from VehicleTB"
    vehicletb = cur.execute(query).fetchall()
    return vehicletb
data = vehicletbquery()

ww = QtWidgets.QLabel()
for i, d in enumerate(data):
    if i == 6:
        ww.w.setPixmap(QtGui.QPixmap.fromImage(d))
        
ww.show()
app.exec()

I know the problem is from my image values but I don't know how to handle it, the best I could do was to convert the Pillow image to string and doing that, i can display the image on the PYQT Label, the label just comes out empty.

The data type BLOB save bytes, in your case you are trying to save a PIL object throwing the error. The solution is to convert those objects. Then the same happens with the data obtained from the database but in reverse:

import sqlite3
import io
from PyQt5 import QtGui, QtWidgets

from PIL import Image
import cv2 as cv

img =  cv.imread('1.1 cat.jpeg.jpeg')
im = Image.fromarray(img)
im.save("file.png")


con = sqlite3.connect("Final_Avirs.db")
cur = con.cursor()


def createtb():
    queryveh = """CREATE TABLE IF NOT EXISTS VehicleTB(Scan_DI  INTEGER PRIMARY KEY NOT NULL UNIQUE,
    Vehicle_number  TEXT NOT NULL, Vehicle_type TEXT NOT NULL, Cam_loc  TEXT NOT NULL, Date_Time    TEXT NOT NULL, 
    Vehicle_number_pic BLOB NOT NULL) """

    cur.execute(queryveh)
    con.commit()


def vehicledetailsquery(vn, vt, cl, dt, vnp):
    scan_id = vn + "1"
    query = (
        " INSERT INTO 'VehicleTB' ( Vehicle_number, Vehicle_type, Cam_loc, "
        "Date_Time, Vehicle_number_pic ) VALUES( ?, ?, ?, ?, ?)"
    )
    cur.execute(query, (vn, vt, cl, dt, vnp))
    con.commit()


img = Image.open("file.png")
createtb()

# convert to bytes
f = io.BytesIO()
img.save(f, format="PNG")
img_bytes = f.getvalue()

vehicledetailsquery("aswe23", "2039230", "cam-2", "23343", img_bytes)


def vehicletbquery():
    query = "SELECT * from VehicleTB"
    vehicletb = cur.execute(query).fetchall()
    return vehicletb


data = vehicletbquery()

app = QtWidgets.QApplication([])

scroll_area = QtWidgets.QScrollArea(widgetResizable=True)
container = QtWidgets.QWidget()
scroll_area.setWidget(container)
lay = QtWidgets.QVBoxLayout(container)


for row_data in data:
    for i, d in enumerate(row_data):
        if i == 5:
            # QPixmap from bytes
            pixmap = QtGui.QPixmap()
            pixmap.loadFromData(d)
            label = QtWidgets.QLabel()
            label.setPixmap(pixmap)
            lay.addWidget(label)

scroll_area.show()
app.exec()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM