IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Lire et afficher une image en Qt


Sujet :

Qt

  1. #61
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    bon ben superjaja à très bien expliquer à ma place

    J'utilise un vector pour éviter de gérer la destruction de cette mémoire temporaire. Ça se fera tout seule.
    Bon si tu sait que tes valeurs sont entre 0 et 1 y as plus simple. Tu lit pixel à pixel et les met directement dans ton QImage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for (int x = 0; x < rows; ++x)
    {
         for (int y = 0; y < columns; ++y)
         {
             float f;
             in >> f;
             value = qRgb( f * 255, f * 255, f * 255);
             uneImage.setPixel(x,y,value);
          }
     }

  2. #62
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Effectivement j'y avais pas pensé tout à l'heure. Je pense que c'est beaucoup mieux comme ca.

    A toi de jouer lisco.

  3. #63
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Points : 131
    Points
    131
    Par défaut
    Bonjour, apres 3 jours de travail, je vois pas trop mon travail évolué. Voici ou j'en suis ,J'ai 2 codes et certainement celui que Yan m'avait proposé est meilleur cad sans créer de buffer du fait que la vie du buffer doit etre gérer par nous meme et sa destruction et aussi des problemes liés à des fuites de memoire,mais de travailler avec un QImage et setPixel.c'est celui là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    QImage uneImage(rows, columns, QImage::Format_RGB32);
    QRgb value ;
     
    for (int x = 0; x < rows; ++x)
    {
         for (int y = 0; y < columns; ++y)
         {
             float f;
             in >> f;
             value = qRgb( f , f, f );
             uneImage.setPixel(x,y,value);
          }
     }
     
     
     
     
     
    ui->ZoneImage->setPixmap(QPixmap::fromImage(uneImage));
    sauf que le probléme est que l'image construite n'est pas bonne, elle est toute blanche!!donc je vois que des parties blanche et noires??

    L'autre code que je gére l'image avec un buffer m'affiche l'image mais sauf que aussi c'est en RGB alors que j'aimerais qu'elle soit en niveau de gris:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     char* image = (char*) malloc(isize);
     
       file.read ( image,rows*columns * 4);//Chaque pixel est codé sur 32 bits donc je multiplie par 4.
     
        for (int i = 0; i < rows; i++)
       {
          for (int j = 0; j < columns; j++)
          {
              *(image + (i*columns + j)) = ((MaxSignalLevel - MinSignalLevel) * *(image +(i*columns + j)))/(QuantLevels) ;
                // w = *(image + (i*columns + j)) ;
           }
      }
     
       QImage uneImage((uchar*)image , rows, columns, QImage::Format_ARGB32) ;
     
       //Jusqu'ici je peux afficher l'image mais en RGB, et ensuite j'essaie de transformer l'image en niveaux de gris.
     
       std::vector<float> buffer(rows*columns);
     
      QVector<QRgb> table(256) ;
       uneImage.setColorTable(table) ;
     
       for (int l = 0; l < 256 ; l++)
       {
           table[l] = qRgb(l, l, l) ;
     
           uneImage.setColorTable(table) ;
       }
     
     
       ui->ZoneImage->setPixmap(QPixmap::fromImage(uneImage));
    Et ma methode de convertion de la table des couleurs ne marche pas!!Si vous pouvez m'aider svp a ameliorer mes codes et prendre le meilleur??
    Merci d'avance!

  4. #64
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Les 2 codes ne font pas du tout la même chose

    Dans le premier, tu considères que les float sont les valeurs réelles tandis que dans le 2nd tu nous dis que l'image est une palette indexée, faudrait savoir ce que c'est ton format :s

  5. #65
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    pourquoi tu utilise cela???
    je croyais que tes valeurs étaient entre 0 et 1

  6. #66
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Points : 131
    Points
    131
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* image = (char*) malloc(isize);
       file.read ( image,rows*columns * 4);
    Ma question est comment fonction la methode read de file:c'est a dire:

    est ce read lit le contenu du fichier et le stoque dans la variable image??

  7. #67
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    read() lit le nombre d'octet que tu souhaites c'est a dire pour toi rows*columns * 4 et le met dans le buffer que tu crées c'est a dire image en gros ça marche comme fread() en C si mes souvenir sont bons.

  8. #68
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Points : 131
    Points
    131
    Par défaut
    oui mais il lit où??c'est àa ma question, il lit dans le fichier file ou??
    Merci

  9. #69
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par lisco Voir le message
    oui mais il lit où??c'est àa ma question, il lit dans le fichier file ou??
    Merci
    tu voudrais qu'il lise ou??

  10. #70
    Membre actif Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Points : 273
    Points
    273
    Par défaut
    La méthode read() est issu de QIODevice, ou d'une des classes filles.

    Si tu fait QFile::read() tu lis d'un fichier, que tu aura ouvert avant...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    QFile file("toto.txt")
    file.open(QFile::...)
    
    file.read(char *data, qint64 taille)
    Tu lis le fichier toto.txt, et tu mets le résultat dans data, et tu commences au début du fichier.

    Je suis peut être hors contexte, j'ai pas lu tout le thread, mais sur la dernière question...

  11. #71
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Points : 131
    Points
    131
    Par défaut
    Citation Envoyé par cayou66 Voir le message
    Tu lis le fichier toto.txt, et tu mets le résultat dans data, et tu commences au début du fichier.

    Je suis peut être hors contexte, j'ai pas lu tout le thread, mais sur la dernière question...
    Non tu as bien répondu à ma question, merci

    Et on peut stoquer n'importe qu'il type de données ou uniquement des données de type char??c'at à dire et si j'ai des unsigned char ou des long?

  12. #72
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    long * image = (long*) malloc(isize);
    file.read ( (char*)image,rows*columns * 4);
    A mon avis je pense que cela devrait marcher.

  13. #73
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Points : 131
    Points
    131
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    long * image = (long*) malloc(isize);
    file.read ( (char*)image,rows*columns * 4);
    Exactement c'est là ma grande question car on a déclaré un pointeur image de type long et ensuite dans la methode il me parait que c'est un pointeur de type char??

  14. #74
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par lisco Voir le message
    Exactement c'est là ma grande question car on a déclaré un pointeur image de type long et ensuite dans la methode il me parait que c'est un pointeur de type char??
    c'est parceque c'est le mot char qui choque. Il faut pas le comprend comme cela.
    Tu passe un pointeur sur une mémoire composé de N octet(char).
    Par exemple, un long 32bits prend une taille mémoire de 4 char
    Pour ton image de float de taille W*H, comme un float fait une taille de 4char,
    tu passe une mémoire de 4*W*H à la fonction read.

  15. #75
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Points : 131
    Points
    131
    Par défaut
    ok, merci les guars.A present je retourne avec mon image car j'ai pas encore les resultats voulus.Je vous tiens au courant.Et encore merci grace a vous je m'améliore bien

  16. #76
    Membre actif Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Points : 273
    Points
    273
    Par défaut
    Ce forum est là pour ça

    Tiens nous au courant.

  17. #77
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Points : 131
    Points
    131
    Par défaut
    Bonjour, j'ai essayé d'afficher les valeurs de mes pixels pour savoir dans quel domaine ils varient et j'ai remarquer qu'elles sont comprises entre 0 et 2^32 je pense tout simplement parce qu'ils sont codés sur 32 bits!!
    Et aussi à ma grande surprise que ce sont tous des valeurs entiéres ya pas de floats!!!Bref tout cela est lié parceque j'ai peu d'info sur mes fichiers image.Mais je dois pouvoir lire directement les valeurs et les afficher?Voici ce que j'ai toujours mais l'image ne s'affiche pas correctement mais je pense que je lis les pixels mais ils sont decalés et quand j'affiche l'image reelle les parties noires sont blaches chez moi?ça commence à m'inquieter bientot 1 mois je suis dessus
    J'ai essayer aussi avec d'autres types d'image comme avec une image unsigned short mais c'est pareil!!
    J'ai besoin de votre aide et je suis pret a repondre à toute vos questions pour apporter des precisions.ya t-il aussi un autre myen sans QImage et setpixel??
    Merci d'avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    file.seek(430) ;
    QImage uneImage(rows, columns, QImage::Format_RGB32);
    QRgb value ;
     
    for (int x = 0; x < rows; ++x)
    {
         for (int y = 0; y < columns; ++y)
         {
             qint32 f;
             in >> f;
        //QMessageBox::information(this, tr("Image Viewer"), tr("la valeur du pixel est%1.").arg(f)) ;
             value = qRgb( f*2^16 , f*2^16, f*2^16 );
             uneImage.setPixel(x,y,value);
          }
     
    ui->ZoneImage->setPixmap(QPixmap::fromImage(uneImage));
     }

  18. #78
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    value = qRgb( f*2^16 , f*2^16, f*2^16 );

    alors là j'y comprend plus rien. Tu parle de float entre 0 et 1 maintenant c'est autre chose et en plus tu multiplie tes valeur par 2¨16 alors qu'il faut donner des valeur entre 0 et 255 dans qRgb

  19. #79
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Citation Envoyé par lisco Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
             value = qRgb( f*2^16 , f*2^16, f*2^16 );
    Pourquoi le 2^16 ?
    J'aimerais aussi savoir pourquoi le qint32 et pas un quint32 ?
    Enfin je pense qu'il faut plus d'info sur ton fichier image.
    Es tu sure de lire au bonne endroit ?
    As tu un moyen de verifier que ton fichier est valid qu'il a deja fonctionner ?

    [EDIT] Désolé de poster les même question que yan il a repondu avant moi... Et oui c'est lui le plus rapide

  20. #80
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Points : 131
    Points
    131
    Par défaut
    Citation Envoyé par superjaja Voir le message
    Pourquoi le 2^16 ?
    Parce que j'ai regardé et j'ai vu que le niveau max de mes pixels est compris entre 0 et 2^16!!!En fait ya une confusion dans ma tete car je crois que si on me dit que mes pixels sont codés sur 16bits donc les valeurs des pixels varient de 0 à 2^16???Est ce je me trompe?


    Citation Envoyé par superjaja Voir le message
    J'aimerais aussi savoir pourquoi le qint32 et pas un quint32 ?
    Parce que j'ai vu que j'avais des valeurs entieres pour mes pixels!

    Citation Envoyé par superjaja Voir le message
    Enfin je pense qu'il faut plus d'info sur ton fichier image.
    Es tu sure de lire au bonne endroit ?
    As tu un moyen de verifier que ton fichier est valid qu'il a deja fonctionner ??


    Voila je vois pas trop de difference avec mon code sauf que je fais plus simple avant de generaliser en utilisant des templates..

Discussions similaires

  1. Lire et afficher une image
    Par pretyy dans le forum Débuter
    Réponses: 6
    Dernier message: 01/02/2012, 12h22
  2. Lire et afficher une image au format pgm
    Par didi_di dans le forum C++
    Réponses: 4
    Dernier message: 17/12/2009, 15h19
  3. Lire et afficher une image 3D (RGB)
    Par 77Camille dans le forum MATLAB
    Réponses: 1
    Dernier message: 06/06/2007, 12h09
  4. Lire et afficher une image (format TIFF)
    Par nuans dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 30/04/2007, 15h33
  5. [Débutante]Lire et afficher une image IRM sous C++ builder
    Par larimoise dans le forum C++Builder
    Réponses: 13
    Dernier message: 04/12/2006, 08h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo