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 :

Y a-t-il plus rapide qu'une QGraphicsView pour afficher


Sujet :

Qt

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 77
    Par défaut Y a-t-il plus rapide qu'une QGraphicsView pour afficher
    Bonjour à tous,

    voila j'affiche une image qui est issue d'un buffer (image brute et pas de type bmp, jpg ou autre), donc actuellement je mets mon image dans une QImage - > QPixmap -> QGraphicScene -> QGraphicsView. Je trouve que le temps de traitement est très long, alors je me demande s'il n'existe pas un autre moyen beaucoup plus rapide que de passer par une QGraphicsView ?

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par SuperSeb95 Voir le message
    Bonjour à tous,

    voila j'affiche une image qui est issue d'un buffer (image brute et pas de type bmp, jpg ou autre), donc actuellement je mets mon image dans une QImage - > QPixmap -> QGraphicScene -> QGraphicsView. Je trouve que le temps de traitement est très long, alors je me demande s'il n'existe pas un autre moyen beaucoup plus rapide que de passer par une QGraphicsView ?
    Dans le logiciel que je developpe, ce qui coûte c'est la conversion ImageBrut -> QImage. j'utilise donc un thread pour cela.

    Le reste est négligeable.

  3. #3
    Inactif  


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

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Si tu as une image de très grande taille, le temps sera long quelque soit la méthode d'affichage.

    Si tu parles que le code est "lourd", tu peux simplifier en utilisant un QPixmap directement (avec loadFromData) et l'afficher directement avec un QLablel

    Ensuite il reste le problème de conversion de l'image au format RGB utilisé pour l'affichage. Tu peux peut être travailler directement avec le format final pour éviter les conversions

    Comment génère tu ton buffer ? Tu peux peut être commencer par créer une QPixmap puis dessiner dedans avec QPainter. Ca évitera les copies de données et le conversion de format.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Si tu as une image de très grande taille, le temps sera long quelque soit la méthode d'affichage.
    S'il affiche qu'un QPixmap, en dessous de 15000*15000 , une fois en mémoire, il n'y as pas de problème.
    C'est vraiment la convertion Brut->QImage qui coûte chère.


    Peut tu dire un peux ce que tu affiche et ce que tu doit faire sur cette image?

  5. #5
    Inactif  


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

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Citation Envoyé par yan Voir le message
    S'il affiche qu'un QPixmap, en dessous de 15000*15000 , une fois en mémoire, il n'y as pas de problème.
    Je pensais au fait que QGraphicsView redimensionne par défaut (il me semble) donc qu'il y aurait un coût pour le redimensionnement.
    Dans la pratique, je n'ai jamais essayé d'afficher une image de 15000*15000

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 77
    Par défaut
    merci monsieur pour vos réponses, mais je viens d'approffondire le problème et voici ce que j'ai constaté. tout d'abord je vais vous expliquer le plus clairement ce que je fais.
    Je reçois une image de 2000*3000 pixels en brute par une callback. Cette callback envoie un signal à une "fonction slot". Cette "fonction slot" affiche l'image dans une QGraphicsView qui a été défini dans mon mainwindow.ui.
    Voici le code de ma "fonction slot" (simplifiée)
    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
     
        // Stop screen updates to avoid flash during screen changes
        setUpdatesEnabled(false);
     
        m_image = malloc(width*height);
        if (m_image != NULL)
        {
            memcpy(m_image, image_recue_callback, (width*headerheight));
            image = QImage((uchar *)m_image,width, height, QImage::Format_Indexed8);
            // divise l'image par 4
            image = image.scaled((int)(width/4), (int)(height/4), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
            imagePixmap = imagePixmap.fromImage(image, Qt::AutoColor);
            imageScene.addPixmap(imagePixmap);
           //recalcule la taille de ma graphicsView en fonction de l'image reçue
            ui->graphicsView_Image->resize((int)(m_width/4), (int)(m_height/4));
            ui->graphicsView_Image->setScene(&imageScene);
            // Now, reactivate screen update
            setUpdatesEnabled(true);
            free(m_image);
    avec :
    QImage image;
    QPixmap imagePixmap;
    QGraphicsScene imageScene;

    donc ce que je constate c'est que pendant environ 20s mes images arrivent correctement c'est à dire périodiquement, et le débit est fluide, mais après ces 20s mon PC ralenti, les images arrivent plus lentement, ma souris a un déplacement saccadé, etc mais ça ne s'aggrave pas plus dans le temps.
    Alors j'ai utilisé HTOP pour voir si ma conso CPU et ma conso mémoire augmentent mais non, rien.
    Par contre le problème semble provenir de là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ui->graphicsView_Image->setScene(&imageScene);
    puisque c'est la seule ligne de code qui en commentaire fait que tout se déroule correctement.

    Y-a-t-il des choses à libérer ou à faire lorsque l'on joue avec une QGraphicsView ?

  7. #7
    Inactif  


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

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    malloc ??? memcpy ??? aie, mes yeux !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imageScene.addPixmap(imagePixmap);
    Cela veut dire que tu ajoutes une nouvelle image à chaque mise à jour de la vue. Si tu ne vides pas ta scène, tu vas te retrouver avec beaucoup d'items. Et à chaque fois, tu fais une copie de l'image...
    Vérifie le nombre d'items dans ta scène et regarde s'il évolue au cours du temps.

    Dans ce cas, à mon avis le mieux est de créer une nouvelle classe dérivant de QGraphicsPixmapItem et qui s'occupe de mettre à jour que l'image ?

    Et pour le reste ? Utiliser une QPixmap ? Utiliser un QLabel ? Dessiner directement dans la pixmap plutôt que dans une mémoire tampon ?

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 77
    Par défaut
    d'après ce que tu dis le fais de faire un addScene ajoute à l'image d'avant ? pourtant la taille mémoire ne semble pas bouger. Est-il possible de vider ma Scene dans mon code, sans avoir à passer par autre chose ?

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    1- tu n'as pas besoin de ce memcpy
    2- créé la QImage dans la callback et envoie cette QIMage par le signal (la copy sera transparente)
    3- imageScene.addPixmap() te retourne un pointeur. Il te faut le faire qu'une seule fois et updater sont QPixmap.

    Pour info tu peux associer une LUT à ta QImage avec http://qt.developpez.com/doc/latest/...#setcolortable pour le passage vers la QPixmap


    Pour l'update de l'affichage tu peux appeler update sur le QGraphicsPixmap ou sur la scene.

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 77
    Par défaut
    le pointeur retourné par addPixmap est un QGraphicsPixmapItem, or un removeItem attend en passage de parametre un QGraphicsItem, donc le compilateur n'est pas content, comment transformer de façon simple et rapide un QGraphicsPixmapItem en QGraphicsItem ?
    Désolé si mes questions vous semblent bêtes, mais j'ai vraiment du mal à saissir toutes ces QImage, QPixmap, Q ..., je trouve ça d'un compliqué et prise de tête. Enfin ,c'est normal, ce sont mes débuts

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par SuperSeb95 Voir le message
    le pointeur retourné par addPixmap est un QGraphicsPixmapItem, or un removeItem attend en passage de parametre un QGraphicsItem, donc le compilateur n'est pas content, comment transformer de façon simple et rapide un QGraphicsPixmapItem en QGraphicsItem ?
    ????
    ben tu n'as rien à faire. QGraphicsPixmapItem hérite de QGraphicsItem...

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 77
    Par défaut
    Ce n'est pas ce que me dit mon compilo, ceci dit, je pense plutot utiliser ta solution avec un QGraphicsScene::update, je pense que ça prendra moins de ressource que de détruire pour reconstruire, par contre il faut passer comme parametre (qreal x, qreal y, qreal w, qreal h ), il n'y a pas un moins simple pour dire que c'est toute l'image que l'on veut updater ?

    bon je viens de faire dans mon code, cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       if (m_firstImage == true)
        {
            imageScene.addPixmap(imagePixmap);
            m_firstImage = false;
        }
        else
        {
            imageScene.update(0,0,width,height);
        }
    donc effectivement je n'ai plus de ralenti de mon PC par contre, il m'affiche la première image et après plus rien alors que je sais qu'il execute bien le update. est-ce que cela vient des coordonnées que je lui ai passé ?

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    SI tu ne lui donne pas la nouvelle pixmap, c'est normale
    http://qt.developpez.com/doc/latest/...tem/#setpixmap

    Pour le update, lis la doc...
    http://qt.developpez.com/doc/latest/...csitem/#update

  14. #14
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 77
    Par défaut
    bon j'ai fait ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        //bien sur avant j'ai modifié mon image (je dis ça pour Yan :D  )
        if (m_firstImage == true)
        {
            imageScene.addPixmap(imagePixmap);
            m_firstImage = false;
        }
        else
        {
            imageScene.update(imageScene.sceneRect());
        }
    mais ça ne fonctionne toujours pas.
    Par contre, à chaque fois on me parle de QGraphicsItem mais je n'en utilise pas, je fais QImage->QPixmap->QGraphicsscene->QGraphicsview, c'est une bonne solution ou pas, j'ai des doute maintenant, parce que ça marche bien, sans parler de mes petits problèmes

    bon j'ai essayé avec le removeItem et ça semble fonctionner, oui j'avais oublié de faire l'include

    Mais avec update, rien

  15. #15
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Par défaut
    Lq ton image change, tu dois mettre à jour le pixmap de ton pixmapItem

    imageItem->setPixmap(newImagePixmap);

    QPixmap : représente une image.
    QPixmapItem : représente un item dans une scene, c'est un QGraphicsItem comme les autres sauf qu'il dispose d'une méthode setPixmap qui permet de mettre à jour l'image interne à l'item.

    J'espère que ça peut aider à dissiper la confusion.

    Enfin, lq tu change le pixmap de l'item, Qt met à jour la scene automatiquement, tu ne dois pas avoir besoin d'update.

  16. #16
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par ness522 Voir le message
    Enfin, lq tu change le pixmap de l'item, Qt met à jour la scene automatiquement, tu ne dois pas avoir besoin d'update.
    J'ai mis cela car dans mon cas la taille de l'image peut changer et toute la scène n’est pas mise à jour à cause du cache. Mais c'est peut être pas utile pour lui.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Plus rapide qu'une fonction ?
    Par tachmou dans le forum MATLAB
    Réponses: 2
    Dernier message: 07/02/2013, 10h07
  2. [WD17] Imprimer plus rapidement sur une thermique
    Par grety44 dans le forum WinDev
    Réponses: 4
    Dernier message: 29/06/2012, 14h40
  3. Réponses: 13
    Dernier message: 25/04/2012, 18h04
  4. Réponses: 1
    Dernier message: 09/11/2009, 09h53
  5. MySQL pourrait être 8 fois plus rapide selon une étude de AppsLab
    Par Gordon Fowler dans le forum Actualités
    Réponses: 0
    Dernier message: 06/11/2009, 11h06

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