来自std :: vector <std :: uint32_t>保持数组的原始RGB值的CBitmap

时间:2016-09-13 21:31:54

标签: c++ image bitmap mfc

我在网上找到的库中的以下代码中有一个原始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值加载到位图中。有什么想法吗?

2 个答案:

答案 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_picControlChb之间交换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);