我有一个GdiPlus :: Bitmap对象,我需要构建一个将其转换为QPixmap的函数。我正在使用Qt 5.8.0,性能是我的一个问题。我在网上找不到任何相关内容,甚至在QImages中搜索GDI +图像。我不需要访问像素数据,因此我所要做的就是将GDI +位图转换为可以在QWidget中显示的内容。
到目前为止我发现的最有希望的解决方案是在QtWin中使用fromHBitMap()http://doc.qt.io/qt-5/qtwin.html#fromHBITMAP,但是我没有必要的知识/经验来理解位图的句柄。< / p>
答案 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;
}