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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 ?

+ 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