2017-03-22 1 views
0

GdiPlus :: Bitmapオブジェクトがあり、QPixmapに変換する関数を作成する必要があります。私はQt 5.8.0を使用しています。パフォーマンスは私の心配です。私はこのオンラインについては何も見つけられず、QImagesへのGDI +画像を検索しています。ピクセルデータにアクセスする必要はありません.GW +ビットマップをQWidgetに表示できるものに変換するだけです。GDI PlusビットマップをQPixmapに変換する

QtWinでfromHBitMap()を使用することが最も有望な解決策です:http://doc.qt.io/qt-5/qtwin.html#fromHBITMAPしかし、私はビットマップへのハンドルを理解するために必要な知識/経験を持っていません。

答えて

0

私はその後のGdiPlusからそれを変換するには、次のコードを使用し、私は赤と青のバイトを反転し、これを行う方法を持っていた:: QPixmapのビットマップ:

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

この方法を、しかし、遅くて実行には60ミリ秒かかりました。そこで私の新しい方法は、Gdiplus :: Bitmapをファイルに保存して、そのファイルへのパスを使ってQPixmapのコンストラクタから読み込むことでした。 この方法は、5ミリ秒ほど高速です。

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

「ビットマップ」オブジェクトが手元にあるとします。 また、あなたの開発環境が「Windowsプログラミング」と「Qt」の両方をサポートしているとします。

上記の前提に基づいて、HICONを「ビットマップ」から取得し、それを「QPixmap QtWin::fromHICON(HICON icon」に渡すことができます。

ステップ:

まず最初に、 "Gdiplus.h" を含める必要があります。 「QtWin」も入力してください。

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

これを試してください。 上記のコードはテストされていません。 アイデアを出します。

0

私はあなたがいないが、Qtは最も確かにない

ピクセルデータにアクセスする必要はありません。 QtはウィジェットのレンダリングにGDIを使用せず、QImageで動作するラスターバックエンドを使用します。フードの下でQPixmapQImageのまわりのラッパーに過ぎず、イメージデータをコピーしないので2つの間で変換するのは安いです。

したがって、QPixmapの形式であっても、あなたが選択した経路はいつでもQImageになります。

関連する問題