c++ - 数组到 C++ 中的位图

标签 c++ winapi gdi+

我想通过将数组转换为位图来创建位图。首先,我根据数据创建位图:

BITMAPINFO info;
info.bmiHeader.biBitCount = 32;
info.bmiHeader.biClrImportant = 0;
info.bmiHeader.biClrUsed = 0;
info.bmiHeader.biCompression = BI_RGB;
info.bmiHeader.biHeight = -height(windowSize);
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info.bmiHeader.biSizeImage = 0;
info.bmiHeader.biWidth = width(windowSize);
info.bmiHeader.biXPelsPerMeter = 100;
info.bmiHeader.biYPelsPerMeter = 100;
Gdiplus::Bitmap *b = new Bitmap(&info, (void *)field);

然后我尝试在屏幕上绘制它,但它只包含黑色:

Gdiplus::Graphics *graphics = new Gdiplus::Graphics(hdc);
...
graphics->DrawImage(<pointer to bitmap>, 0, 0);

该数组目前包含每个像素 32 位数据,每个分量 8 位。红色分量左移 24 位,绿色分量左移 16 位,蓝色分量左移 8 位。

我可以向您保证,字段数组包含的数据中的颜色不全是黑色。有谁知道我做错了什么?

最佳答案

场阵列是否在图像的整个生命周期内持续存在?采用指向图像数据的指针的位图构造函数实际上将存储对该数据的引用,而不是复制它。

如果要复制数据并将其存储在 Bitmap 对象中,请对图像位使用 NULL(或使用不需要指向图像位的指针的构造函数),并使用 Bitmap.LockBits 函数来填充在数据中。您不必手动复制这些位;只需填写 BitmapData 结构并使用 ImageLockModeWrite|ImageLockModeUserInputBuf 标志,GDI+ 将自行复制这些位。

使用 Bitmap(INT,INT,INT,PixelFormat,BYTE*) 构造函数(请参阅 http://msdn.microsoft.com/en-us/library/ms536315%28v=vs.85%29.aspx )可能会更幸运,因为它可以让您更直接地控制 GDI+ 解释数据的方式(包括使其显而易见)您的数据是否包含 alpha 信息)。

关于c++ - 数组到 C++ 中的位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9348089/

相关文章:

C++ - 模板模板参数可以是变量或函数吗?

c++ - 简单的 if 循环无法正常工作

c - RegSetValueEx : creating a DWORD value with the const BYTE data type

c++ - 来自完成端口的 "Un-associate"套接字

c# - 在新位置画圆而不删除先前的圆?

c# - System.Drawing 对于 2D 游戏编程来说足够快吗?

c++ - 在子字符串后插入字符串

C#/XAML winRT 应用导出 PDF

compact-framework - Compact Framework - 轻量级 GUI 框架?

c++ - N3290 C++ 草案中的临时生命周期