我在网上找到的库中的以下代码中,我在原始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 Picture控件中显示它。我可以调整它的大小,并且知道如何在控件中显示位图。我无法将RGBA值加载到位图中。有什么想法吗?
最佳答案
CBitmap::CreateBitmap成员函数可以从内存块构造位图。 lpBits参数需要一个指向字节值的指针。从技术上讲,将指针传递给uint32_t
值数组是一种未定义的行为(尽管它将在Windows的所有little-endian实现中起作用)。
内存布局必须格外小心。仅针对Windows API调用CreateBitmap记录了此信息,而MFC文档中根本没有记录此信息:
基于这样的假设,内存已正确对齐,并且将缓冲区重新解释为指向字节的指针已得到很好的定义,这是一种具有适当资源处理的实现:
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。