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

Discussion :

Créer un image bitmap avec Qt/OpenGL

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Créer un image bitmap avec Qt/OpenGL
    Bonjour,
    Pour mon projet de stage, je suis entrain de développer une application sous Qt qui utilise OpenGL pour créer une mosaïque à partir d'une image.
    Je souhaiterai après faire une sorte de Screenshoot de la mosaïque et créer une image format Bitmap (non compressée pour mieux lire les données) mais je ne sais pas comment le faire.
    J'ai trouvé un exemple de création d'une image Bitmap avec les fichiers de la biblio classique Iosteam :

    File *image
    const char format="bmp";
    fwrite(format,1,2,image);
    .
    .
    .....Avec l'ajout continuel des données pour former l'entête puis le reste des données ainsi que les valeurs des couleurs R V B en donnant aussi la taille qui va être taille =hauteur*largeur en pixel de l'image.
    Bref c'est juste pour faire court.
    J'ai pensé à adapter ça en remplaçant "File" par QFile et remplacer les fwrtie par ce qui correspond en Qt.
    Comme je suis débutante et que j'essaye de lire pas mal de tuto sur Qt je perds bcp de temps alors je viens solliciter une aide pour avancer SVP.
    Aussi j'ai essayé avec QImage et QPixMap mais les exemples sur le site de Qt en anglais ne sont pas clairs. Je n'ai pas réussi à utiliser les méthodes comme il faut.
    SVP si vous avez des exemples clairs sur comment faire une image avec QImage ou QPixMap veuillez m'aider en la postant ici.
    Aussi j'aimerai pouvoir adopter si possible la méthode ::SetDotsPerX() et ::SetDotsPerY() pour pouvoir donner la bonne dimension au pixel et avoir une image en taille réelle voulu : exemple: pour avoir un pixel qui fera en taille réel un carré de 4,25mm on peut donner 1cm=2,325 pixel pour définir la résolution.
    Alors j'aimerai pouvoir appliquer ça avec ces méthodes.

    Si vous savez le faire ou avez d'autres suggestions merci de m'aider.


  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 52
    Points : 60
    Points
    60
    Par défaut
    Pour récupérer une image a partir du contexte openGL : utiliser glReadPixels (mais la méthode peut etre longue, glCopyTexImage2D est plus rapide )

    pour la sauvegarde d'une image, avec les données récupérées tu crées une QImage, et la sauve au format voulu....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    unsigned char* lTemp;
    lTemp = calloc( width*height*3, sizeof(unsigned char) );
     
    //pas sur de cette ligne
    glReadPixels(0, 0, width, height,  GL_RGB, GL_UNSIGNED_BYTE,  lTemp);
     
    QImage myImage(lTemp, with, height, QImage::format_RGB888);
     
    myImage.save("toto.bmp");
    pour les methodes setDots*, désolé pas d'idées pour le moment.

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Je vais essayer ta méthode merci.
    Il y a aussi une idée de récupérer les couleurs R V B pour chaque pixel qui sont déjà enregistrés dans un tableau (parce qu'on exporte aussi un canevas de la mosaïque qui est sous forme d'un tableau de données qui contient les coordonnées de position de chaque pixel et sa couleur).
    Dans ce cas là comment enregistrer une image avec ce tableau de couleurs.?
    Quelle est la syntaxe avec QImage ou QPixMap ou même l'idée avec QFile que j'ai mise???
    S'il y a un exemple clair comme celui que tu viens de me poster ce serait aussi parfait.

    Merci d'avance

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 52
    Points : 60
    Points
    60
    Par défaut
    Il y a aussi une idée de récupérer les couleurs R V B pour chaque pixel qui sont déjà enregistrés dans un tableau (parce qu'on exporte aussi un canevas de la mosaïque qui est sous forme d'un tableau de données qui contient les coordonnées de position de chaque pixel et sa couleur).
    ??? pas tout compris, un tableau de positions et de couleurs ca s'appelle une image non?

    Sinon une idée comme ca à la volée :
    A partir du tableau il faudrait dessiner dans la QImage/QPixmap et sauvegarder le résultat grace à la méthode save() [ elle est déjà implémentée, voici le lien vers la documentation pour plus de détails : http://qt.developpez.com/doc/4.7/qimage/#save ]

    Mais réfléchit a ca :
    - Quel est l'avantage de regénerer une image présente dans le buffer openGL plutot de la lire ? openGL fais très bien son taf généralement....

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation:
    Il y a aussi une idée de récupérer les couleurs R V B pour chaque pixel qui sont déjà enregistrés dans un tableau (parce qu'on exporte aussi un canevas de la mosaïque qui est sous forme d'un tableau de données qui contient les coordonnées de position de chaque pixel et sa couleur).
    ??? pas tout compris, un tableau de positions et de couleurs ca s'appelle une image non?
    Je ne voulais trop rentrer dans les détails du projet mais bon puisque ça ne parait pas logique j'explique : on charge une image qui est utilisée comme source pour dessiner la mosaïque avec OpenGL. Après l'utilisateur peut effectuer des changement sur la mosaique tel que rapporocher les carreaux ou les éloigner et aussi changer le nombre de couleurs de l'image (les diminuer ou augmenter)...etc Après tous ces changements peuvent être exportés dans un tableau. Moi je veux l'utiliser après pour créer une sorte de ScreenShoot et enregistrer un image Bitmap de la mosaique. C'est pour cela je parlais de récupérer les coordonnées des pixels (leur position) et la couleur (une valeur pour chaque canal : R V et B).

    J'ai essayé la méthode SAVE (QImage:: save) avec les exemples de la doc que j'ai déjà trouvé auparavant mais qui n'étaient pas suffisamment clairs pour moi (pas écrits dans une classe avec un main qui puisse afficher cette image sauvegardée afin de tester réellement la méthode) mais ça me génère des erreurs.

    Comme pour l'exemple suivant:

    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
     
    QImage image(3, 3, QImage::Format_RGB32);
     QRgb value;
     
     value = qRgb(189, 149, 39); // 0xffbd9527
     image.setPixel(1, 1, value);
     
     value = qRgb(122, 163, 39); // 0xff7aa327
     image.setPixel(0, 1, value);
     image.setPixel(1, 0, value);
     
     value = qRgb(237, 187, 51); // 0xffedba31
     image.setPixel(2, 1, value);
     
     image.save("IMAGE PIXEL.bmp","bmp",-1);

    ça me génère ça comme erreurs :

    mainIMG.obj : error LNK2001: symbole externe non résolu "__declspec(dllimport) public: bool __thiscall QImage::save(class QString const &,char const *,int)const " (__imp_?save@QImage@@QBE_NABVQString@@PBDH@Z)
    1>mainIMG.obj : error LNK2001: symbole externe non résolu "__declspec(dllimport) public: void __thiscall QImage::setPixel(int,int,unsigned int)" (__imp_?setPixel@QImage@@QAEXHHI@Z)
    1>mainIMG.obj : error LNK2001: symbole externe non résolu "__declspec(dllimport) public: virtual __thiscall QImage::~QImage(void)" (__imp_??1QImage@@UAE@XZ)
    1>mainIMG.obj : error LNK2001: symbole externe non résolu "__declspec(dllimport) public: __thiscall QImage::QImage(int,int,enum QImage::Format)" (__imp_??0QImage@@QAE@HHW4Format@0@@Z)
    1>mainIMG.obj : error LNK2001: symbole externe non résolu "__declspec(dllimport) unsigned int __cdecl qRgb(int,int,int)" (__imp_?qRgb@@YAIHHH@Z)

    1>C:\Users\Amel\Documents\Visual Studio 2010\Projects\openGLImage\Release\openGLImage.exe : fatal error LNK1120: 5 externes non résolus
    ========== Génération*: 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========

  6. #6
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Mais réfléchit a ca :
    - Quel est l'avantage de regénerer une image présente dans le buffer openGL plutot de la lire ? openGL fais très bien son taf généralement....
    Je sais que je peux te parraitre bête mais je suis vraiment débutante avec OpenGL et je ne maitrise pas encore bien son utilisation en programmation.
    Peux tu me donner un exemple sur ça SVP??
    Je pense que c'est glReadPixel() mais comment situer le buffer et appliquer la méthode??

    Merci

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 52
    Points : 60
    Points
    60
    Par défaut
    Pour afficher normalement tu dois avoir utiliser la méthode paintGL je crois...
    c'est dans cette méthode que tu peux accéder au contexte openGL pour modifier ton image/dessiner/plaquer des textures etc etc...

    pour récupérer les pixels affichés l'écran il faut le faire dans cette méthode.

    un méthode simple peut etre de mettre un booléen comme membre de ta QGLWidget et dans la méthode paintGL de tester la valeur de ce booléen.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    QGLWidget::painGL(){
      // ... Mise à jour de l'affichage.
     
      if (mDoScreenshot == true ) 
      {
        doScreenshot();
      }
     
      // post traitements si besoins...
    }
    Pour ton problème de compilation je dirais qu'il manque quelque chose à ton environnement de compilation...

    1/ as tu bien fait ton include de QImage ?
    2/ est ce que Qt est bien reconfiguré ton IDE (visual studio apparement ) afin qu'il trouve les DLL de Qt?

  8. #8
    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
    Salut.
    Si tu affiche dans une QGLWidget, tu peut récupérer ton image avec grabFrameBuffer.
    http://qt.developpez.com/doc/4.7/qgl...rabframebuffer.

    Après il existe plusieurs méthodes en OpenGl pour faire cela. Mais cela dépend de ta carte 3D.
    Tu peux aussi regarder http://qt.developpez.com/doc/4.7/qglpixelbuffer/

  9. #9
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    En plus des méthodes indiquées par Yan, tu as également la fonction QGLWidget::renderPixmap pour générer directement une pixmap.

    Sinon, tu peux également utiliser la fonction QWidget::render pour "copier" le widget dans une pixmap

  10. #10
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Oui effectivement c'était des erreurs de compilation. j'ai ajouté le bin de Qt aux variables d'environnements et corrigé un chemin vers une bibliothèque et c'est bon plus d'erreur.

    Les exemples marchent avec QImage::save maintenant j'essaye de l'appliquer sur la mosaïque.

    Merci pour vos indications sur les méthodes d'OpenGL, je suis également entrain de les tester et ça prend du temps parce que je ne les connaissais pas et pas évident pour moi de les intégrer avec la bonne syntaxe et au bon endroit pour que ça marche.

    L'essentiel est donc d'arriver à copier le contenu du Buffer OpenGL après le paintGL() dans une QPixMap et l'enregistrer c'est bien cela?
    Dès que j'aurais un résultat en peu moins satisfaisants je l'annoncerai pour conclure ce sujet (espérons que ça ne me prenne pas des siècles quand même .....)

Discussions similaires

  1. Lecture d'images Bitmap avec Java
    Par stocha dans le forum Débuter
    Réponses: 3
    Dernier message: 22/04/2010, 13h31
  2. [OpenGl ES] Retourner une image bitmap (avec VBO ?)
    Par me.in.worst dans le forum OpenGL
    Réponses: 2
    Dernier message: 18/09/2009, 11h15
  3. Réponses: 4
    Dernier message: 28/04/2008, 14h40
  4. image Bitmap avec numéro Random
    Par patrice419 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 19/04/2007, 11h13
  5. Créer un wallpaper bitmap avec une seule couleur
    Par Tenguryu dans le forum C++Builder
    Réponses: 1
    Dernier message: 31/03/2006, 15h43

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