【问题标题】:array to bitmap in c++数组到C++中的位图
【发布时间】:2012-03-10 00:34:22
【问题描述】:

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

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 位。

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

【问题讨论】:

  • 您的像素格式错误; 32bpp 使每个像素的顶部字节未使用,但底部字节未使用。但是,除非您的图像全是红色,否则您仍然应该看到一些东西。
  • @arx 感谢您指出这一点。但是红色或蓝色是最重要的字节吗?
  • 另外我只是得到垃圾内存:/
  • 你的颜色会被弄乱,但你仍然会看到一些东西。既然你不是问题可能在别处。无论如何,我认为每个 DWORD 都是 00BBGGRR。 Gdi+ 是否需要透明度信息?如果是的话,你会想要 AABBGGRR。
  • 您需要将最高位设置为 FF 以表示“不透明”。所以红色是 0xFFFF0000,绿色是 0xFF00FF00,蓝色是 0xFF0000FF。

标签: c++ winapi gdi+


【解决方案1】:

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

如果要复制数据并将其存储在 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 信息)。

【讨论】:

    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多