2017-03-22 3 views
0

J'ai un objet GmapPlus :: Bitmap, et j'ai besoin de construire une fonction qui le convertit en QPixmap. J'utilise Qt 5.8.0, et la performance est une de mes préoccupations. Je ne trouve rien à ce sujet en ligne, je suis même à la recherche d'images GDI + pour QImages. Je n'ai pas besoin d'accéder aux données de pixels, donc tout ce que j'ai à faire est de convertir un bitmap GDI + en quelque chose qui peut être affiché dans un QWidget.Convertir Bitmap GDI Plus en QPixmap

La solution la plus prometteuse que j'ai trouvé jusqu'ici est d'utiliser le fromHBitMap() dans QtWin: http://doc.qt.io/qt-5/qtwin.html#fromHBITMAP, mais je n'ai pas les connaissances/l'expérience nécessaires pour comprendre les handles aux bitmaps.

Répondre

0

J'ai eu une méthode de le faire où je feuilletais les octets rouge et bleu, puis utilisé le code suivant pour le convertir d'un Gdiplus :: Bitmap à un QPixmap était lent et a pris un bon 60 millisecondes à exécuter. Ma nouvelle méthode consistait donc à enregistrer le fichier Gdiplus :: Bitmap dans un fichier, et à utiliser le chemin d'accès à ce fichier pour lire depuis le constructeur de QPixmap. Cette méthode est BEAUCOUP plus rapide, environ 5 millisecondes.

QPixmap getAsQPixmap(GdiPlus::Bitmap bitmap) 
{ 
    std::string path = "C:/path_to_img.....png"; 

    // One of my functions to unlock the Gdi+ bitmap 
    _unlockGdiPlusBitmap(); 

    // Get Clsid 
    CLSID pngClsid; 
    getEncoderClsid(format_mime, &pngClsid); 

    // Save bitmap 
    // stringToWString() was a function that I wrote to convert a standard string to be a wide string 
    bitmap->Save(stringToWString(path).c_str(), static_cast<const CLSID*>(&pngClsid)); 

    // Lock bitmap 
    _lockGdiPlusBitmap(); 

    // Create the QPixmap 
    QPixmap new_img(path); 

    return new_img; 
} 
0

Je suppose que vous avez un objet "Bitmap" dans votre main. En outre, je suppose que votre environnement de développement prend en charge à la fois "Windows programming" et "Qt". Basé sur les hypothèses ci-dessus, vous pouvez obtenir le HICON de la "Bitmap" et le passer à "QPixmap QtWin::fromHICON(HICON icon)".

Étapes:

Tout d'abord vous devez inclure "Gdiplus.h". Incluez également "QtWin".

HICON hIcon; 
Status st = <<Your Bitmap Object>>.GetHICON(&hIcon); 
QPixmap pixM = QtWin::fromHICON(hIcon); 

Essayez ceci. Le code ci-dessus n'a pas été testé. Ça donne une idée.

0

Je ne ai pas besoin d'accéder aux données de pixels

Vous n'avez pas, mais Qt certainement le fait. Qt n'utilise pas GDI pour le rendu des widgets - à la place, il utilise le backend raster qui fonctionne sur un QImage. Sous le capot un QPixmap est juste un emballage autour d'un QImage et il est peu coûteux de convertir entre les deux, car il ne copie pas de données d'image. Donc, quelle que soit la route que vous choisirez, il faudra impliquer QImage à un moment donné, même si c'est sous la forme QPixmap. Cependant

QPixmap getAsQPixmap(Gdiplus::Bitmap bitmap) 
{ 
    // One of my functions to flip blue and red bytes of the image 
    _flipBlueWithRed(); 

    // m_pBytes is a pointer to an unsigned char that marks the start of the image 
    // It was retrieved from locking the Gdiplus::Bitmap 
    auto result = QPixmap::fromImage(QImage(m_pBytes, getWidth(), getHeight(), QImage::Format_RGB888)); 

    // Restore data back to original state 
    _flipBlueWithRed(); 

    return result; 
} 

Cette méthode,,: