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. #81
    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
    Je connais pas trop boost donc j'ai du mal a bien comprendre ce qu'il fait dans le code. Cependant a mon avis il faut que tu arrive a savoir qu'elle est le type de la variable image. Aussi il faut que tu connaisses le type T utilisé pour lire ton image (pour ton fichier). Apres tu essaies de refaire le calcul qu'il fait pour trouver d et n et remplir son image correctement.

    Une fois que tu aurais fait tout ça tu pourra commencer a utiliser Qimage et a remplir ton image.

    Bon courage.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  2. #82
    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
    question :
    1- qu'es ce que T

    2- connaît tu FxdHeader

  3. #83
    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
    T c'est tout simlement la declaration d'un template à mon avis ça ne bloque pas beaucoup, parcontre FxdHeader c'est tout simplement l'en-tete de mon fichier que j'ai deja reussi à lire et dont je connais deja la taille.




    je peux donner ça mais je sais pas si ça va fournir:


    J'ai besoin de votre aide svp!

  4. #84
    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
    T c'est tout simlement la declaration d'un template
    ...
    je demandais qu'es ce que tu utilise pour T
    un float ,un int, auter chose, t'en sait rien? c'est le header qui te le dit??

  5. #85
    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
    Là on commence enfin à savoir quelque chose sur le format. 6 pages pour le savoir le minimum, ça fait mal...

    Voila je vois pas trop de difference avec mon code sauf que je fais plus simple avant de generaliser en utilisant des templates..
    En faisant plus simple, tu fais complètement faux car tu mélanges tout les types sans savoir où tu vas.

    Ensuite, le code que tu as montré est totalement portable, je ne vois donc pas pourquoi tu veux le réécrire. Si tout ce que tu veux est une solution portable, sans autre raison, tu peux arrêter ici de coder ce lecteur, tu l'as.

  6. #86
    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
    Désolé Yan j'avais pas pigé ta question, en fait pour T c'est le Header qui nous dit normalement.Mais pour commencer j'aimerais l'utiliser pour un float et ensuite generalisé.J'espere que j'ai repondu à ta question cette fois ci.

  7. #87
    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
    En bon IrmatDen, tu pense que ce code je peux l'inclure dans mon IHM en Qt et il va faire la meme chose??Si oui je pense que tout est fait car j'ai déja mon interface en Qt!!Donne moi des précisions stp!!!

  8. #88
    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
    Désolé Yan j'avais pas pigé ta question, en fait pour T c'est le Header qui nous dit normalement.Mais pour commencer j'aimerais l'utiliser pour un float et ensuite generalisé.J'espere que j'ai repondu à ta question cette fois ci.
    Je comprends pas ce que tu veux dire ?

    Comme je l'ai deja demandé et yan aussi c'est très important de connaitre le type de T utilisé pour lire ton fichier. A partir de cela on sera enfin si on doit lire des int, float, uchar...
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  9. #89
    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
    j'ai dit que le type de T dépend de notre image ; il peut etre float ou int ou autre chose

  10. #90
    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 IrmatDen Voir le message
    Ensuite, le code que tu as montré est totalement portable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file.read( (char*)image.get(), size );
    y as le problème d'endian qui n'est pas géré
    Mais c'est claire que je commence enfin à capter quelque chose..



    Le prend pas mal, mais il te manque toutes les bases de ce qu'est une image..
    Ton problème c'est la dynamique de tes valeurs. Tes valeurs, que ce soit des float, des int, des long ou autre, c'est le même problème, il faudra les convertir entre 0 et 255 pour les afficher. La manière la plus simple est une règle de trois :
    valeur min correspond à 0
    valeur max correspond à 255.

    est tu as déjà les valeur min et max.

    Voilà, maintenant tu as vraiment tout ce qu'il faut pour réussir.

    Reprend ce thread depuis le début et re-part de ce squelette de code.

    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
    QFile f(...)
    QDataStream in (&f);
    in.setEndian(...)
    
    /*lecture de l'entête
    ...
    
    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(...);
             uneImage.setPixel(x,y,value);
          }
     }

  11. #91
    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
    Bien vu yan j'avais pas vu ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lfoat MaxSignalLevel;   // maximum value in the image
    float MinSignalLevel;   // minimum value in the image
    A la bonne vieille règle de trois...
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  12. #92
    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
    T est défini par FxdHeader::PixelType j'ai l'impression (ie, ce peut être float, uchar ou ushort).

    Pour générer une QImage à partir de ça, il faudrait faire quelque chose du style:

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #include <cassert>
    #include <cmath>
    #include <limits>
    #include <QImage>
     
    template <typename T>
    QImage toQImage(const FxdHeader &fxdHeader, boost::shared_array<T> image)
    {
    	return QImage();
    }
     
    template <>
    QImage toQImage<unsigned char>(const FxdHeader &fxdHeader, boost::shared_array<T> image)
    {
    	QImage image((int)fxdHeader.NbRows, (int)fxdHeader.NbColumns, QImage::Format_RGB32);
     
    	uchar *imgBits = image.bits();
    	size_t imgBitsIndex = 0;
    	const size_t imageSize = fxdHeader.NbRows * fxdHeader.NbColumns;
    	for (size_t i = 0; i < imageSize; i++, imgBitsIndex += 4)
    	{
    		imgBits[imgBitsIndex]     = 0xFF;
    		imgBits[imgBitsIndex + 1] = image[i];
    		imgBits[imgBitsIndex + 2] = image[i];
    		imgBits[imgBitsIndex + 3] = image[i];
    	}
     
    	return image;
    }
     
    template <>
    QImage toQImage<unsigned short>(const FxdHeader &fxdHeader, boost::shared_array<T> image)
    {
    	QImage image((int)fxdHeader.NbRows, (int)fxdHeader.NbColumns, QImage::Format_RGB32);
     
    	uchar *imgBits = image.bits();
    	size_t imgBitsIndex = 0;
    	const size_t imageSize = fxdHeader.NbRows * fxdHeader.NbColumns;
    	const float invMaxUShort = 255.f / std::limits<unsigned short>::maximum;
    	for (size_t i = 0; i < imageSize; i++, imgBitsIndex += 4)
    	{
    		imgBits[imgBitsIndex]     = 0xFF;
    		imgBits[imgBitsIndex + 1] = std::floor(image[i] * invMaxUShort);
    		imgBits[imgBitsIndex + 2] = std::floor(image[i] * invMaxUShort);
    		imgBits[imgBitsIndex + 3] = std::floor(image[i] * invMaxUShort);
    	}
     
    	return image;
    }
     
    template <>
    QImage toQImage<float>(const FxdHeader &fxdHeader, boost::shared_array<T> image)
    {
    	QImage image((int)fxdHeader.NbRows, (int)fxdHeader.NbColumns, QImage::Format_RGB32);
     
    	uchar *imgBits = image.bits();
    	size_t imgBitsIndex = 0;
    	const size_t imageSize = fxdHeader.NbRows * fxdHeader.NbColumns;
    	for (size_t i = 0; i < imageSize; i++, imgBitsIndex += 4)
    	{
    		const int value = static_cast<int>(image[i] * 255);
     
    		std::assert(value >= 0 && value <= 255);
     
    		imgBits[imgBitsIndex]     = 0xFF;
    		imgBits[imgBitsIndex + 1] = static_cast<uchar>(value);
    		imgBits[imgBitsIndex + 2] = static_cast<uchar>(value);
    		imgBits[imgBitsIndex + 3] = static_cast<uchar>(value);
    	}
     
    	return image;
    }
    Code non testé et non compilé, mais ça devrait te donner une idée. Si jamais ça assert dans la conversion en float, c'est tout simplement que contrairement à ce que tu nous as dit, les float ne sont pas stockés entre 0 et 1, mais autre chose.

    Edit: bien sûr, c'est a appeler après quantization

    Edit 2 : si la hauteur ou la largeur de ton image est plus grande que la valeur maximale d'un entier signé, ce code n'est plus fonctionnel, je te laisse le soin d'implémenter le tiling ou le scaling, selon ce que tu veux faire..

    Edit 3: j'avais pas vu vos réponses Yan et superjaja :/

  13. #93
    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 gars pour tout le temps que vous avez passé avec mon sujet.Je vais y retourner en esperant que cette fois ci je vais le conclure.
    IrmatDen avec ta solution je dois donc installer Boost et l'utiliser avec Qt??
    Merci

  14. #94
    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
    Citation Envoyé par lisco Voir le message
    IrmatDen avec ta solution je dois donc installer Boost et l'utiliser avec Qt??
    Heuuu... Je te laisse le soin d'y répondre tout seul

  15. #95
    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, voila mon code source et je compte y aller pas à pas avec vous car ya vraiment quelque chose qui m'échappe et que j'arrive pas a capter et la meme j'affiche les resultats de l'en tete.Pour ce qui est des valeurs main et max du signal je trouve 0 et 1 donc je pense inutile de faire une convertion, Yan
    J'affiche quelque chose en niveau de gris mais les valeurs sont decalées j'ai pas l'image exacte!!!
    Intervenez si vous avez des idées svp.


    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     QFile file(FileName);
          if(!file.open(QIODevice::ReadOnly))             //On ouvre le fichier en lecture seule
          {
              QMessageBox::information(this, tr("Image Viewer"),
                                         tr("Cannot Open %1.").arg(FileName));
          }
         else
         {
           //  QMessageBox::information(this, tr("Image Viewer"),
             //                           tr("File succesfull Open %1.").arg(FileName));
     
                QDataStream in(&file);//Lecture des donnees contenues dans le fichier.
                in.setByteOrder(QDataStream::LittleEndian) ;//Pour lire dans le bon ordre et avec le bon format des donnees.
     
         in >> FileMagic >> rows >> columns >> NbFrames >> PixelTypes >> QuantLevels >> MaxSignalLevel >> MinSignalLevel >> CommentLength ;
     
             QMessageBox::information(this, tr("Image Viewer"),
            tr("the number of the File Magic is%1.").arg(FileMagic),tr("the number of the rows is%1.").arg(rows),tr("the number of the columns is%1.").arg(columns) );
     
             QMessageBox::information(this, tr("Image Viewer"),
           tr("the number of the NbFrames is%1.").arg(NbFrames) , tr("Types of the pixel in the file is%1.").arg(PixelTypes));
     
             QMessageBox::information(this, tr("Image Viewer"),
           tr("the number of the Quantization  level is%1.").arg(QuantLevels) , tr("maximum value in the image is%1.").arg(MaxSignalLevel));
     
             QMessageBox::information(this, tr("Image Viewer"),
             tr("Minimum value in the image is%1.").arg(MinSignalLevel) ,  tr("the length of the comment is%1.").arg(CommentLength) ) ;
     
     
    isize = 1500 * 1800 * 4
            ; //Taille de l'image en Octet.4 étant la taille d'un Octet car l'image est codé sur 4 Octet.
     
     
       file.seek(128 + CommentLength) ;     //Je me positionne a  la fin des commentaires et au debut des pixels de l'image pour faire la lecture.
     
    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;
        //QMessageBox::information(this, tr("Image Viewer"), tr("la valeur du pixel est%1.").arg(f)) ;
             value = qRgb( f , f, f );
             uneImage.setPixel(x,y,value);
          }
     
     
     }
     
    ui->ZoneImage->setPixmap(QPixmap::fromImage(uneImage));

  16. #96
    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
    Pour ce qui est des valeurs main et max du signal je trouve 0 et 1 donc je pense inutile de faire une convertion, Yan
    Lie bien ce que j'ai écrit, il te faut des valeurs entre 0 et 255 !!!!! et non 0 et 1

  17. #97
    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
    Tu dis que tes valeurs sont entre 0 et 1. Bon si tu es sur OK. Sinon tu es sur aussi que c'est bien des float qu'il faut lire ?

    Si c'est de float entre 0 et 1 pourquoi tu fais pas ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    value = qRgb( f*255 , f*255, f*255 );
    De meme tu confirmes donc que les valeurs de tes pixels peuvent etre par exemple 0.00876 ou autre non ?

    [EDIT] décidement yan tu reponds vraiment trop vite.. donc desolé pour les redites
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  18. #98
    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
    Exactement c'est là la confusion, je sais pas si je m'explique bien mais le probléme est que:

    *Quand je lis le Header et j'affiche les valeurs j'ai niveau min du signal = 0 et niveau max du signal = 1.

    *Ensuite quand j'affiche les valeurs de mes pixels je vois que des valeurs entieres entre 0 et 2^32 ou -2,15*10^9 et 2,15*10^9 et ceci parce que les pixels sont codes sur 32 bits???

    *Alors que dans la spec on dit que l'image est float??

  19. #99
    Membre habitué Avatar de sardik
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 135
    Points : 143
    Points
    143
    Par défaut
    *Ensuite quand j'affiche les valeurs de mes pixels je vois que des valeurs entieres entre 0 et 2^32 ou -2,15*10^9 et 2,15*10^9 et ceci parce que les pixels sont codes sur 32 bits???
    Avec quoi affiche tu la valeur de tes pixels ?

  20. #100
    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
    Oui peux tu expliquer comment tu deduis tes valeurs 2^32 ou -2,15*10^9 et 2,15*10^9 ?

    Si tu as des float tu ne peut pas tout de suite faire un conversion binaire valeur entiere comme ça.

    En gros un float ou un int sont tout les deux sur 32 bits mais comme le codage est different une meme valeur binaire ne representa pas le meme nombre...
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

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