c++ - 绘制 8bpp 灰度位图(非托管 C++)

标签 c++ mfc winapi bitmap gdi

我一直试图在 8bpp 灰度位图上绘图,但没有成功。这是我的一些尝试。也许有人可以指出我做错了什么。

============================================= ====

尝试 1:创建、选择和绘制:

在构造函数中:

CBitmap bm;
bm.CreateBitmap (200, 200, 1, 8, NULL);

在 OnDraw 中:

CDC *mdc=new CDC ();
HGDIOBJ tmp = mdc->SelectObject(bm);

结果:tmp为NULL,失败。

============================================= ====

尝试 2:创建 DIBSection

在构造函数中:

HBITMAP hbm;
BITMAPINFOHEADER bih;
BITMAPINFO bi;
HANDLE hb;
CDC* myDc = new CDC ();
HDC hdc = myDc->GetSafeHdc ();
void* bits;
RGBQUAD rq [256];

 initBi ();
 hbm = CreateDIBSection (hdc, &bi, DIB_RGB_COLORS, &bits, NULL, 0);

...

void CEightBitDrawingView::initBi()
{
 bih.biSize = sizeof (BITMAPINFOHEADER);
 bih.biWidth = 200;
 bih.biHeight = -200;
 bih.biPlanes = 1;
 bih.biBitCount = 8;
 bih.biCompression = BI_RGB;
 bih.biSizeImage = 0;
 bih.biXPelsPerMeter = 14173;
 bih.biYPelsPerMeter = 14173;
 bih.biClrUsed = 0;
 bih.biClrImportant = 0;

 memset ((void *) rq, 0, 256 * sizeof (RGBQUAD));

 bi.bmiHeader = bih;
 bi.bmiColors = rq;
}

结果:这甚至无法编译,因为 BITMAPINFO bmiColors 成员定义为: RGBQUAD bmiColors[1];

所以不会接受超过一种 RGB 颜色。事实上,我分配给这个成员的任何东西都不会编译! (他们能不能让它变得更复杂!?)

如有任何建议,我们将不胜感激!谢谢!

============================================= ====

最佳答案

这里。演示如何 - 在非托管世界中 - 在堆栈上分配动态大小的结构、填充它并将其传递给 CreateDIBSection 的代码。

#include <malloc.h>

HBITMAP CreateGreyscaleBitmap(int cx, int cy)
{
  BITMAPINFO* pbmi = (BITMAPINFO*)alloca( sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256);
  pbmi->bmiHeader.biSize = sizeof (pbmi->bmiHeader);
  pbmi->bmiHeader.biWidth = cx;
  pbmi->bmiHeader.biHeight = cy;
  pbmi->bmiHeader.biPlanes = 1;
  pbmi->bmiHeader.biBitCount = 8;
  pbmi->bmiHeader.biCompression = BI_RGB;
  pbmi->bmiHeader.biSizeImage = 0;
  pbmi->bmiHeader.biXPelsPerMeter = 14173;
  pbmi->bmiHeader.biYPelsPerMeter = 14173;
  pbmi->bmiHeader.biClrUsed = 0;
  pbmi->bmiHeader.biClrImportant = 0;

  for(int i=0; i<256; i++)
  {
    pbmi->bmiColors[i].rgbRed = i;
    pbmi->bmiColors[i].rgbGreen = i;
    pbmi->bmiColors[i].rgbBlue = i;
    pbmi->bmiColors[i].rgbReserved = 0;
  }

  PVOID pv;
  return CreateDIBSection(NULL,pbmi,DIB_RGB_COLORS,&pv,NULL,0);
}

关于c++ - 绘制 8bpp 灰度位图(非托管 C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3142349/

相关文章:

c++ - linux libc.so.6 错误

c++ - LPWSTR 字符串到 bool?

c++ - MFC 中 AddString 的性能缓慢

c++ - OpenGL 4 核心配置文件、着色器和 MFC

c++ - 消息处理程序 INT_PTR 返回值的目的是什么?

python - 如何使用 python 和 win32 api 将彩色文本写入文本框?

c++ - WinMain 编译,但 wWinMain 不在 CodeBlocks

c++ - QListWidget::setEditTriggers(QAbstractItemView::AnyKeyPressed) 不工作

c++ - 如何在保持其值的同时将 C++ unsigned char 变量转换为 char 变量

c++ - 错误 : MFC projects cannot define _ATL_NO_EXCEPTIONS