我在网上找到的库中的以下代码中有一个原始RGBA值的位图。 “svgren。
auto img = svgren::render(*dom, width, height); //uses 96 dpi by default
//At this point the 'width' and 'height' variables were filled with
//the actual width and height of the rendered image.
//Returned 'img' is a std::vector<std::uint32_t> holding array of RGBA values.
我需要知道如何将这张图片放入CBitmap,这样我就可以在MFC图片控件中显示它。我可以预先知道它,我知道如何在控件中显示位图。我不能做的是将RGBA值加载到位图中。有什么想法吗?
答案 0 :(得分:2)
CBitmap::CreateBitmap成员函数可以从内存块构造位图。 lpBits 参数需要指向 byte 值的指针。将指针传递给uint32_t
值数组在技术上是未定义的行为(尽管它适用于Windows的所有little-endian实现)。
必须特别注意内存布局。这仅针对Windows API调用CreateBitmap进行了记录,而不是MFC文档中的所有内容:
矩形中的每条扫描线必须是字 1 对齐(非字对齐的扫描线必须用零填充)。
基于这样的假设,内存已正确对齐,并且将缓冲区重新解释为指向字节的指针已得到很好的定义,这是一个具有适当资源处理的实现:
CBitmap Chb;
Chb.CreateBitmap(width, height, 1, 32, img.data());
mProjectorWindow.m_picControl.ModifyStyle(0xF, SS_BITMAP, SWP_NOSIZE);
Chb.Attach(mProjectorWindow.m_picControl.SetBitmap(Chb.Detach()));
最后一行代码在m_picControl
和Chb
之间交换GDI资源的所有权。这样可以确保正确清除m_picControl
先前拥有的GDI资源,并使m_picControl
成为新创建的位图的唯一所有者。
<小时/> 1 我相信should read dword aligned。
答案 1 :(得分:0)
CBitmap Chb;
HBITMAP bmp = CreateBitmap(width, height, 1, 32, &*img.begin());
ASSERT_ALWAYS(bmp != NULL)
Chb.Attach(bmp);
//PicControl.ModifyStyle(0xF, SS_BITMAP, SWP_NOSIZE);
//PicControl.SetBitmap(Chb);
mProjectorWindow.m_picControl.ModifyStyle(0xF, SS_BITMAP, SWP_NOSIZE);
mProjectorWindow.m_picControl.SetBitmap(Chb);