将GDI Plus位图转换为QPixmap

时间:2017-03-22 16:52:56

标签: c++ qt gdi+ qimage qpixmap

我有一个GdiPlus :: Bitmap对象,我需要构建一个将其转换为QPixmap的函数。我正在使用Qt 5.8.0,性能是我的一个问题。我在网上找不到任何相关内容,甚至在QImages中搜索GDI +图像。我不需要访问像素数据,因此我所要做的就是将GDI +位图转换为可以在QWidget中显示的内容。

到目前为止我发现的最有希望的解决方案是在QtWin中使用fromHBitMap()http://doc.qt.io/qt-5/qtwin.html#fromHBITMAP,但是我没有必要的知识/经验来理解位图的句柄。< / p>

3 个答案:

答案 0 :(得分:0)

我假设你有&#34; Bitmap&#34;你手中的物体。 此外,我假设您的开发环境支持&#34; Windows编程&#34;和&#34; Qt&#34;。

根据以上假设,您可以从&#34; Bitmap&#34;获取HICON。并将其传递给&#34; QPixmap QtWin::fromHICON(HICON icon)&#34;。

步骤:

首先,您必须包含&#34; Gdiplus.h&#34;。 还包括&#34; QtWin&#34;。

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

试试这个。 以上代码未经测试。 它提出了一个想法。

答案 1 :(得分:0)

  

我不需要访问像素数据

你没有,但Qt肯定会这样做。 Qt不使用GDI来渲染小部件 - 而是使用在QImage上运行的栅格后端。在引擎盖下,QPixmap只是QImage周围的包装,因为它不会复制任何图像数据,所以在两者之间进行转换很便宜。

因此,无论您选择哪种路线,都会在某个时刻涉及QImage,即使它是QPixmap的形式。

答案 2 :(得分:0)

我有一个这样做的方法,我翻转红色和蓝色字节,然后使用以下代码将它从Gdiplus :: Bitmap转换为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;
}