c++ - 如何在 C++/MFC/GDI 中创建一个非常大的位图

标签 c++ mfc bitmap gdi cdc

我希望能够在 C++ MFC 应用程序中创建一个大的(比如 20,000 x 20,000)像素位图,使用 CDC 派生类写入位图。我已尝试按照 MSDN 文档中的描述使用内存 DC,但这些似乎仅限于与当前显示驱动程序兼容的大小。

我目前正在使用位图打印驱动程序来完成这项工作,但它非常慢并且由于假脱机 GDI 信息而使用了大量的中间存储。

我正在寻找的解决方案不应涉及图元文件或假脱机,因为我正在绘制的模型需要数百万次 GDI 调用才能呈现。

我可以通过多个内存 DC 使用分而治之的方法,但这似乎是一种非常笨重且不优雅的技术。

有什么想法吗?

最佳答案

CDC 和 CBitmap 似乎只支持设备相关的位图,您可能更幸运地使用 ::CreateDIBSection 创建位图,然后将 CBitmap 附加到它。不幸的是,原始 GDI 接口(interface)有点陈旧。

在 32 BPP 下使用 20,000 x 20,000 可能不太幸运,至少在 32 位应用程序中是这样,因为它需要大约 1.5 GB 的内存,但我得到了一个有效的 HBITMAP,返回值为 16 bpp:

BITMAPINFOHEADER bmi = { sizeof(bmi) };
bmi.biWidth = 20000;
bmi.biHeight = 20000;
bmi.biPlanes = 1;
bmi.biBitCount = 16;
HDC hdc = CreateCompatibleDC(NULL);
BYTE* pbData = 0;
HBITMAP hbm = CreateDIBSection(hdc, (BITMAPINFO*)&bmi, DIB_RGB_COLORS, (void**)&pbData, NULL, 0);
DeleteObject(SelectObject(hdc, hbm));

关于c++ - 如何在 C++/MFC/GDI 中创建一个非常大的位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/138122/

相关文章:

c++ - C++类定义中的第三个词

c++ - 错误 : 'Failed to specialize function template' C2893 'std::invoke'

android - 如何创建 Bitmap 形式的 Drawable 对象

c++ - FLTK C++ Fl_line 不绘制

c++ - 如何静态链接到 POCO C++ so 文件

c++ - JavaScript 上的 ChtmlView MFC 内存泄漏

android - 如何找出有多少空闲堆大小可用于 Android 2.* 的位图?

c# - 处理大型位图(最大 3GB)

c++ - 此输出有效还是编译器错误?

c++ - 我们可以在 MFC 中 Hook 函数调用吗?