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 :

QClipboard : récupérer une image avec la transparence


Sujet :

Qt

  1. #1
    Membre émérite Avatar de onilink_
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    597
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 597
    Points : 2 443
    Points
    2 443
    Par défaut QClipboard : récupérer une image avec la transparence
    Bonjour,
    j'utilise QClipboard pour récupérer une image dans le presse papier.
    Tout marche très bien si l'image viens de Qt et a été crée avec une QImage par exemple.
    En revanche si l'image viens d'ailleurs, comme photoshop, une image sur le navigateur, etc, et bien le canal alpha est perdu.

    Je cherche donc un moyen de récupérer ce canal alpha, pour avoir une image complète.
    Si possible une solution crossplatform, au pire fonctionnelle sous windows.

    Merci bien.
    Circuits intégrés mis à nu: https://twitter.com/TICS_Game

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonjour,

    Vous avez essayé les méthodes image() et pixmap() ou juste l'un des deux pour la récupération des données ? La méthode pixmap() devrait en théorie gérer le canal alpha.

    Bonne journée à vous,
    Louis
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre émérite Avatar de onilink_
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    597
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 597
    Points : 2 443
    Points
    2 443
    Par défaut
    Bonjour,
    j'ai essayé les deux, et a vrai dire ils fonctionnent avec la transparence si l'image a été mise dans le clipboard depuis Qt via une QPixmap ou QImage.
    En revanche ça ne marche qu'avec une image en provenance de Qt. Donc je pense que Qt utilise un format assez strict qui correspond pas forcément a celui qu'on obtiens en copiant une image depuis un logiciel quelconque...

    Du coup j'ai commencé ceci pour windows:
    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
    73
    74
    75
    76
    77
    // for windows only
    struct ImageClipboard
    {
        int a; // ???
        int wid, hei; // Size
        short b; // ???
        short bpp; // Bits per pixels
        // ??? ...
    };
     
    void convert(const void * data, int size, QImage & ret)
    {
        using namespace std;
        const ImageClipboard * header = (ImageClipboard*) data;
        qDebug() << header->wid << header->hei << header->bpp;
     
        if(header->bpp == 32)
        {
            unsigned int * p = (unsigned int*)((char*)data + 52);
            ret = QImage(header->wid, header->hei, QImage::Format_ARGB32);
     
            for(int j=ret.height()-1; j>=0; --j)
            for(int i=0; i<ret.width(); ++i)
            {
                ret.setPixel(i, j, *p++);
            }
        }
        else if(header->bpp == 24)
        {
            unsigned char * p = (unsigned char*)data + 40;
            ret = QImage(header->wid, header->hei, QImage::Format_ARGB32);
            for(int j=ret.height()-1; j>=0; --j)
            for(int i=0; i<ret.width(); ++i)
            {
                ret.setPixel(i, j, *p|*(p+1)<<8|*(p+2)<<16|0xFF000000);
                p += 3;
            }
        }
        else if(header->bpp == 8)
        {
            /// @todo palette mode indexé
            unsigned char * p = (unsigned char*)data + 1064;
            ret = QImage(header->wid, header->hei, QImage::Format_ARGB32);
            for(int j=0; j<ret.height(); ++j)
            for(int i=0; i<ret.width(); ++i)
            {
                ret.setPixel(i, j, *p | *p<<8 | *p<<16 | 0xFF000000);
                p++;
            }
        }
    }
     
    void getImageFromClipboard(QPixmap & ret)
    {
        OpenClipboard(NULL);
        UINT uFormat;
        uFormat = EnumClipboardFormats(0);
        while( uFormat )
        {
            char szFormatName[80];
            GetClipboardFormatName(uFormat, (WCHAR*)szFormatName, sizeof(szFormatName));
            HANDLE data = GetClipboardData(uFormat);
            if(uFormat == 8)
            {
                FILE * f = fopen("dump/8", "wb");
                fwrite(data, GlobalSize(data), 1, f);
                fclose(f);
     
                QImage im;
                convert(data, GlobalSize(data), im);
                ret = QPixmap::fromImage(im);
                break;
            }
            uFormat = EnumClipboardFormats(uFormat);
        }
        CloseClipboard();
    }
    Ça marche bien avec les images venant de mspaint, navigateur web, photoshop (même si photoshop ne donne pas de canal alpha par contre...).
    Par contre ça marche plus avec les images en provenance d'une QImage
    En même temps je ne connais pas le standard des images du clipboard de windows donc j'y suis un peu allé au feeling en regardant a quoi ça ressemblait dans un éditeur hexa.
    Je vais surement jeter un oeil du coté de la source de Qt pour avoir une meilleur idée de la structure.
    (et si quelqu'un a un lien vers des spécifications je suis pas contre non plus)
    Circuits intégrés mis à nu: https://twitter.com/TICS_Game

Discussions similaires

  1. [AC-2007] Insertion d'une image avec fond transparent
    Par Tifriis dans le forum IHM
    Réponses: 21
    Dernier message: 15/06/2017, 16h50
  2. Récupérer une image avec un socket?
    Par sfn84 dans le forum C++Builder
    Réponses: 7
    Dernier message: 13/04/2011, 14h54
  3. Réponses: 4
    Dernier message: 29/10/2010, 14h40
  4. récupérer une image avec readfile
    Par julien1451 dans le forum Langage
    Réponses: 11
    Dernier message: 27/01/2010, 01h06
  5. Réponses: 4
    Dernier message: 07/06/2006, 14h23

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