Partage
  • Partager sur Facebook
  • Partager sur Twitter

Affichage image selon données binaires

Sujet résolu
7 juin 2017 à 9:08:38

Bonjour, 

je travaille actuellement sur une base de données PostgreSQL dans laquelle j'ai une table qui contient un champ "Image". L'image est de type bytea.

Mon problème est le suivant: Je souhaiterai récupérer l'image stockée dans la base de données, puis l'afficher dans un QLabel d'une interface graphique créée avec Qt Designer. Mon script est écrit en python.

Je ne parviens pas à extraire l'image de la base de données. Est ce que quelqu'un pourrait m'aider sur ce problème?

Merci 

-
Edité par Benzouye 7 juin 2017 à 10:11:55

  • Partager sur Facebook
  • Partager sur Twitter
7 juin 2017 à 9:28:12

Bonjour,

Une colonne de type BYTEA contient des données binaires.

Tu dois donc récupérer ces données (avec une "simple" requête SELECT) et les lire comme telles en Python.

Où se trouve ton problème ? Tu ne sais pas faire la requête SQL, ou tu ne sais pas lire et afficher du binaire en Python ?

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
7 juin 2017 à 9:57:17

Merci pour ta réponse, 

Je suis parvenu à créer une image avec le script suivant: 

import sys, os
import psycopg2
import psycopg2.extensions


def writeImage(data):
    image = open('monimage.jpg','wb')
    image.write(data)
    if image:
        image.close()

conn = psycopg2.connect(dbname="BDD_Name", user="postgres", host="localhost", port="5433", password="*****")

cursor = conn.cursor()
cursor.execute('SELECT "Trace_Image"."Image" FROM public."Trace_Image" WHERE "Trace_Image"."ID_Trace" = 1')
data = cursor.fetchone()[0]

writeImage(data)

Le problème ne vient pas de la requête comme je le pensais mais de la lecture et de l'affichage du binaire en python. Il s'agit donc d'un problème python, désolé...

-
Edité par PierreC15 7 juin 2017 à 10:01:14

  • Partager sur Facebook
  • Partager sur Twitter
7 juin 2017 à 10:11:23

PierreC15 a écrit:

Le problème ne vient pas de la requête comme je le pensais mais de la lecture et de l'affichage du binaire en python. Il s'agit donc d'un problème python, désolé...

Pas de souci, je m'en doutais un peu :)

Je déplace dans le forum Python ;)

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
Anonyme
7 juin 2017 à 10:45:03

Quel est le message d'erreur ?

Que renvoie la variable data après un print ?

Si tu write ligne 8, c'est que image existe avant, la condition if est donc inutile !

EDIT: Ce que tu cherchais à faire est sans doute de contrôler le nombre de caractères écrit dans le fichier, mais peu importe, qu'il est écrit ou pas, faudra fermer le fichier.

-
Edité par Anonyme 7 juin 2017 à 11:11:21

  • Partager sur Facebook
  • Partager sur Twitter
7 juin 2017 à 13:10:25

Bonjour, 

Avec le code posté précédemment, j'arrive à créer une Image dans le chemin d'accès spécifié. 

Je voudrai maintenant afficher cette image dans un QLabel de mon interface Graphique. Pour cela j'ai vu que l'on peut utiliser QPixmap. J'ai donc écrit le code suivant:

def Visualisation_Photo(self):
    cursor.execute('SELECT "Trace_Image"."Image" FROM public."Trace_Image" WHERE "Trace_Image"."ID_Trace" = 1')
    data = cursor.fetchone()[0]
    
    image = open('D:\Dossier1\Image.png','wb')
    image.write(data)
    QLabel.setPixmap('D:\Dossier\Image.png')

Mais celui-ci ne fonctionne pas... J'ai le message d'erreur suivant:

TypeError: QLabel.setPixmap(QPixmap): argument 1 has unexpected type 'str'

La variable image est de type 'file' et la variable data est de type 'buffer'

Je ne parviens pas à résoudre ce problème...

Merci


  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
7 juin 2017 à 13:47:51

setPixmap prend en paramètre un objet QPixmap, donc une chaîne de caractères, normal qu'il aime pas...

Essayes un truc du genre

QLabel.setPixmap(QPixmap('D:\Dossier\Image.png'))



-
Edité par Anonyme 7 juin 2017 à 13:48:09

  • Partager sur Facebook
  • Partager sur Twitter
7 juin 2017 à 13:57:27

Merci pour ta réponse, ça fonctionne! =)
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2023 à 13:14:58 - Message modéré pour le motif suivant : Merci d’utiliser le bouton code pour insérer un code sur le forum


2 août 2023 à 18:32:03

Un modérateur du forum va certainement vous interpeller pour  dire qu'on ne déterre pas un sujet résolu et apprendre à poster du code sous une forme plus lisible.

-
Edité par mps 2 août 2023 à 18:32:32

  • Partager sur Facebook
  • Partager sur Twitter
2 août 2023 à 19:28:42

@RakotoNatolotriniavo Bonjour, merci de lire les règles du forum AVANT de poster.

Merci de colorer votre code à l'aide du bouton Code

Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: python;">Votre code ici</pre>.

Merci de modifier votre message d'origine en fonction.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Liens conseillés

Je ferme ici.

  • Partager sur Facebook
  • Partager sur Twitter