使用 Python 将 Blob 图像(二进制图像)转换为 jpeg 图像:该图像从 SQL 数据库检索并上传到 GUI

发布于 2025-01-20 08:23:41 字数 5339 浏览 2 评论 0原文

我正在尝试显示Microsoft SQL数据库的图像。问题在于数据库中的图像是类型BLOB(二进制)。我想在我的GUI中被外交时将其转换为JPEG或PNG。您对我该怎么做有任何想法吗? (抱歉,我的代码中有一些法语...)。 我试图在def liretheme(conn)中编写代码,但它不起作用... 谢谢, caroline

#webtv应用程序layout1

#Importer les librairies utilisées dans ce projet
import PySimpleGUI as sg #Librairie utilisée pour créer notre "graphical user interface" (GUI)
import pyodbc #Librairie utilisée pour accéder au serveur SQL à partir de Python 
import base64
from PIL import Image
import io 

#Pour voir toute les colonnes de la table
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)

#Connexion au serveur SQL

serveur = 'THEM17-IRIC'
mabase = 'ProjetWebTV'
utilisateur = 'caro'
motdepasse = 'Mike1976$'
conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+serveur+
                      ';DATABASE='+mabase+';UID='+utilisateur+';PWD='+ motdepasse)
 
# Toutes les choses à l'intérieur de la fenêtre

titre = [[sg.Text("WebTV: Une application web pour visionner et gérer les images et vidéos", 
font = 200)]]

recherche = [[sg.Text("Entrer mot-clé", font = 20)],      
            [sg.InputText(key = 'input1', tooltip = "Entrez un mot-clé", size = (75,1)), 
             sg.Submit("Soumettre", key=("Soumettre1"), tooltip = "Soumettre votre requête"), 
sg.Submit("Effacer", key=("Effacer1"))],
            [sg.Text("Entrer thème", font = 20)],      
            [sg.InputText(key=('input2'), tooltip = "Entrez un thème", size = (75,1)), 
            sg.Submit("Soumettre",key=("Soumettre2"), tooltip = "Soumettre votre requête"), 
sg.Submit ("Effacer", key=("Effacer2"))],
             [sg.Text("Résultat de la recherche",font = 20)],
             [sg.Image(key = ('output1'), size = (750,1), expand_x = True, expand_y = True)]]
         
myAccount = [[sg.Text("Courriel", font = 20), sg.InputText()],
             [sg.Text("Mot de passe", font = 20), sg.InputText()],
             [sg.Button("Soumettre")]]

newUser = [[sg.Text("Prénom", font = 20), sg.InputText()],
           [sg.Text("Nom", font = 20), sg.InputText()],
           [sg.Text("Pseudo", font = 20), sg.InputText()],
           [sg.Text("Date de naissance", font = 20), sg.InputText()],
           [sg.Text("Photo de profil", font = 20), sg.InputText()],
           [sg.Text("Courriel", font = 20), sg.InputText()],
           [sg.Text("Mot de passe", font = 20), sg.InputText()],
           [sg.Button("Soumettre")]]

tbgrp = [[sg.TabGroup([[sg.Tab("Recherche", recherche, font = 100),
                        sg.Tab("Nouvel utilisateur", newUser, font=30),
                        sg.Tab("Mon Compte", myAccount, font = 100)]], 
                        tab_location = "centertop", 
                        expand_x = True, 
                        expand_y = True)]]

layout = titre + tbgrp 

#Creation de la fenêtre
sg.theme ("DarkBlue13") #Défini la couleur de la fenêtre
window = sg.Window ('WebTV application', 
                   layout,
                   size = (800, 600), 
                   resizable = True, 
                   element_justification= "center", 
                   grab_anywhere = True) 

#event, values = window.read()

#Liste des fonctions
#Fonction qui retourne la recherche par mot-clé
def lireMotcle(conn):
    conn.execute("set transaction isolation level read committed;")
    curseur = conn.cursor()
    idMot = valeurCase
    curseur.execute("select * from catalogue where idMotCle=?",(idMot))
    window['output1'].update('Résultats: \n\n')
    for unfichier in curseur.fetchall():
        #afficher dans résultats
        window['output1'].update('Le mot ' + unfichier[0]+' est dans le fichierID:'+ 
    str(unfichier[1]) + '\n', append = True)
        #print(unfichier[0], unfichier[1])#pour tests dans console
        
**#Fonction qui retourne la recherche par thème
def lireTheme(conn):
    conn.execute("set transaction isolation level read committed;")
    curseur = conn.cursor()
    idTheme = valeurCase
    curseur.execute("SELECT f.contenu FROM fichiers f, reference r Where r.idFichier = f.idFichier AND r.idTheme =?",(idTheme))
    data = curseur.fetchall()
    data = data[0][0]
    binary_data = base64.b64decode(data)
    image2 = Image.open(io.BytesIO(binary_data))
    image2.show()
        #afficher dans résultats
    #window['output1'].update(image)**
        
        
#Fonction qui rentre le courriel et le le mot passe et donne accès à une fenêtre pour ajouter des fichiers


while True:
    event, values = window.read()
    print('event:', event)
    print('values:', values)
    if event == sg.WIN_CLOSED or event == 'Quit':
         break 
     
#Si un utilisateur rentre un mot-clé, retourne nom du fichier et contenu associé au mot-clé 
#event , values = window.Read()

    if event == 'Soumettre1':
        valeurCase = values['input1']
        #print("Lecture de la case: " + valeurCase) #pour tests dans console
        lireMotcle(conn)

#Si un utilisateur rentre un thème, retourne nom du fichier et contenu associé au thème   
#event , values = window.Read()
    if event == 'Soumettre2':
        
        valeurCase = values['input2']
        #print("Lecture de la case: " + valeurCase) #pour tests dans console
        lireTheme(conn)
    
        
window.close()
    
#fin test
ligneattente=input("Fin?")

I am trying to display images from Microsoft SQL database. The problem is that images in the database are of type Blob (binary). I would like to convert it to jpeg or png when it gets diplayed in my GUI. Do you have any idea as to how I could do that? (Sorry, there is a bit of french in my code...).
I tried to write the code in def lireTheme(conn), but it does not work...
Thanks,
Caroline

#WebTV application-Layout1

#Importer les librairies utilisées dans ce projet
import PySimpleGUI as sg #Librairie utilisée pour créer notre "graphical user interface" (GUI)
import pyodbc #Librairie utilisée pour accéder au serveur SQL à partir de Python 
import base64
from PIL import Image
import io 

#Pour voir toute les colonnes de la table
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)

#Connexion au serveur SQL

serveur = 'THEM17-IRIC'
mabase = 'ProjetWebTV'
utilisateur = 'caro'
motdepasse = 'Mike1976

conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+serveur+
                      ';DATABASE='+mabase+';UID='+utilisateur+';PWD='+ motdepasse)
 
# Toutes les choses à l'intérieur de la fenêtre

titre = [[sg.Text("WebTV: Une application web pour visionner et gérer les images et vidéos", 
font = 200)]]

recherche = [[sg.Text("Entrer mot-clé", font = 20)],      
            [sg.InputText(key = 'input1', tooltip = "Entrez un mot-clé", size = (75,1)), 
             sg.Submit("Soumettre", key=("Soumettre1"), tooltip = "Soumettre votre requête"), 
sg.Submit("Effacer", key=("Effacer1"))],
            [sg.Text("Entrer thème", font = 20)],      
            [sg.InputText(key=('input2'), tooltip = "Entrez un thème", size = (75,1)), 
            sg.Submit("Soumettre",key=("Soumettre2"), tooltip = "Soumettre votre requête"), 
sg.Submit ("Effacer", key=("Effacer2"))],
             [sg.Text("Résultat de la recherche",font = 20)],
             [sg.Image(key = ('output1'), size = (750,1), expand_x = True, expand_y = True)]]
         
myAccount = [[sg.Text("Courriel", font = 20), sg.InputText()],
             [sg.Text("Mot de passe", font = 20), sg.InputText()],
             [sg.Button("Soumettre")]]

newUser = [[sg.Text("Prénom", font = 20), sg.InputText()],
           [sg.Text("Nom", font = 20), sg.InputText()],
           [sg.Text("Pseudo", font = 20), sg.InputText()],
           [sg.Text("Date de naissance", font = 20), sg.InputText()],
           [sg.Text("Photo de profil", font = 20), sg.InputText()],
           [sg.Text("Courriel", font = 20), sg.InputText()],
           [sg.Text("Mot de passe", font = 20), sg.InputText()],
           [sg.Button("Soumettre")]]

tbgrp = [[sg.TabGroup([[sg.Tab("Recherche", recherche, font = 100),
                        sg.Tab("Nouvel utilisateur", newUser, font=30),
                        sg.Tab("Mon Compte", myAccount, font = 100)]], 
                        tab_location = "centertop", 
                        expand_x = True, 
                        expand_y = True)]]

layout = titre + tbgrp 

#Creation de la fenêtre
sg.theme ("DarkBlue13") #Défini la couleur de la fenêtre
window = sg.Window ('WebTV application', 
                   layout,
                   size = (800, 600), 
                   resizable = True, 
                   element_justification= "center", 
                   grab_anywhere = True) 

#event, values = window.read()

#Liste des fonctions
#Fonction qui retourne la recherche par mot-clé
def lireMotcle(conn):
    conn.execute("set transaction isolation level read committed;")
    curseur = conn.cursor()
    idMot = valeurCase
    curseur.execute("select * from catalogue where idMotCle=?",(idMot))
    window['output1'].update('Résultats: \n\n')
    for unfichier in curseur.fetchall():
        #afficher dans résultats
        window['output1'].update('Le mot ' + unfichier[0]+' est dans le fichierID:'+ 
    str(unfichier[1]) + '\n', append = True)
        #print(unfichier[0], unfichier[1])#pour tests dans console
        
**#Fonction qui retourne la recherche par thème
def lireTheme(conn):
    conn.execute("set transaction isolation level read committed;")
    curseur = conn.cursor()
    idTheme = valeurCase
    curseur.execute("SELECT f.contenu FROM fichiers f, reference r Where r.idFichier = f.idFichier AND r.idTheme =?",(idTheme))
    data = curseur.fetchall()
    data = data[0][0]
    binary_data = base64.b64decode(data)
    image2 = Image.open(io.BytesIO(binary_data))
    image2.show()
        #afficher dans résultats
    #window['output1'].update(image)**
        
        
#Fonction qui rentre le courriel et le le mot passe et donne accès à une fenêtre pour ajouter des fichiers


while True:
    event, values = window.read()
    print('event:', event)
    print('values:', values)
    if event == sg.WIN_CLOSED or event == 'Quit':
         break 
     
#Si un utilisateur rentre un mot-clé, retourne nom du fichier et contenu associé au mot-clé 
#event , values = window.Read()

    if event == 'Soumettre1':
        valeurCase = values['input1']
        #print("Lecture de la case: " + valeurCase) #pour tests dans console
        lireMotcle(conn)

#Si un utilisateur rentre un thème, retourne nom du fichier et contenu associé au thème   
#event , values = window.Read()
    if event == 'Soumettre2':
        
        valeurCase = values['input2']
        #print("Lecture de la case: " + valeurCase) #pour tests dans console
        lireTheme(conn)
    
        
window.close()
    
#fin test
ligneattente=input("Fin?")

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

燃情 2025-01-27 08:23:41

不确定您的 Blob 图像的格式。

也许您可以尝试以下两种方法来更新 Image 元素上的图像。

window['output1'].update(data=data)

或者

with BytesIO() as output:
    image2.save(output, format="PNG")
    data = output.getvalue()
window['output1'].update(data=data)

Not sure what format for your Blob image.

Maybe you can try following two ways to update image on Image element.

window['output1'].update(data=data)

or

with BytesIO() as output:
    image2.save(output, format="PNG")
    data = output.getvalue()
window['output1'].update(data=data)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文