2017-03-22 1 views
0

Ich habe ein GdiPlus :: Bitmap-Objekt, und ich muss eine Funktion erstellen, die es in eine QPixmap konvertiert. Ich benutze Qt 5.8.0 und Leistung ist ein Anliegen von mir. Ich kann online nichts darüber finden, auch nicht nach GDI + -Bildern bei QImages suchen. Ich muss nicht auf Pixeldaten zugreifen, also muss ich nur ein GDI + Bitmap in etwas konvertieren, das in einem QWidget angezeigt werden kann.Konvertieren von GDI Plus Bitmap in QPixmap

Die vielversprechendste Lösung, die ich bisher gefunden habe, ist die Verwendung der fromHBitMap() in QtWin: http://doc.qt.io/qt-5/qtwin.html#fromHBITMAP, aber ich habe nicht das erforderliche Wissen/Erfahrung, um Griffe zu Bitmaps zu verstehen.

Antwort

0

ich eine Methode, dies zu tun, wo ich die roten und blauen Bytes umgedreht, verwendet dann den folgenden Code aus einer zu einem QPixmap Gdiplus :: Bitmap zu konvertieren: aber

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; 
} 

dieser Methode, war langsam und dauerte gut 60 Millisekunden, um auszuführen. Meine neue Methode bestand also darin, die Gdiplus :: Bitmap in eine Datei zu speichern und den Pfad zu dieser Datei aus dem QPixmap-Konstruktor heraus zu lesen. Diese Methode ist VIEL schneller, etwa 5 Millisekunden.

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

Ich nehme an, Sie haben "Bitmap" -Objekt in der Hand. Ich nehme auch an, dass Ihre Entwicklungsumgebung sowohl "Windows Programmierung" als auch "Qt" unterstützt.

Basierend auf obigen Annahmen können Sie die HICON von der "Bitmap" erhalten und an "QPixmap QtWin::fromHICON(HICON icon) übergeben".

Schritte:

Zuerst müssen Sie "Gdiplus.h" umfassen. Geben Sie auch "QtWin" ein.

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

Versuchen Sie es. Der obige Code wurde nicht getestet. Es gibt eine Idee.

0

Ich brauche keine Pixeldaten

Sie dies nicht tun, aber Qt die meisten sicherlich nicht zugreifen. Qt verwendet GDI nicht zum Rendern von Widgets - stattdessen verwendet es das Raster-Backend, das auf einem QImage arbeitet. Unter der Haube ist ein QPixmap nur ein Wrapper um eine QImage und es ist billig, zwischen den beiden zu konvertieren, da es keine Bilddaten kopiert.

Also, welche Route Sie wählen, wird QImage an einem bestimmten Punkt, auch wenn es in Form einer QPixmap ist.

Verwandte Themen