【发布时间】:2023-03-03 20:18:01
【问题描述】:
我一直在尝试绘制 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 颜色。事实上,我分配给该成员的任何内容都无法编译! (他们能不能让它变得更复杂!?)
任何建议将不胜感激!谢谢!
================================================ ====
【问题讨论】:
-
你试过GDI+吗?或者有什么业务不需要?
-
为了提高速度,我正在将 GDI+ 中的工作示例转换为非托管 C++/GDI。事实证明,要在 GDI 中绘制 8bpp 位图非常困难。
-
GDI+ 不受管理。这是一个基于win32构建的C++库。托管将是 WinForms 或 WPF。