我希望能够在C ++ MFC应用程序中创建一个大的(比如20,000 x 20,000)像素位图,使用CDC派生类来写入位图。我已尝试使用MSDN文档中描述的内存DC,但这些内容似乎仅限于与当前显示驱动程序兼容的大小。
我目前正在使用位图打印驱动程序来完成这项工作,但它非常慢并且由于假脱机GDI信息而使用了大量的中间存储。
我正在寻找的解决方案不应该涉及元文件或假脱机,因为我正在绘制的模型需要数百万的GDI调用来渲染。
我可以通过多个内存DC使用分而治之的方法,但它看起来像是一种非常笨拙和不优雅的技术。
有什么想法吗?
答案 0 :(得分:2)
CDC和CBitmap似乎只支持设备相关的位图,您可能有更多的运气用::CreateDIBSection创建位图,然后将CBitmap附加到该位图。不幸的是,原始的GDI接口有点古怪。
你可能不会在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));
答案 1 :(得分:1)
这很不寻常,因为我经常根据屏幕创建一个DC,用于比屏幕大得多的位图图像 - 在某些情况下加上3000像素 - 完全没有问题。您是否有一些示例代码显示此问题?
答案 2 :(得分:1)
考虑到如此大的图像分辨率,您无法使用兼容的位图创建图像。
示例:
像素深度= 32位=每像素4个字节
像素数= 20.000 * 20.000 = 400.000.000
总字节数=像素数* 4 = 1.600.000.000字节= 1.562.500 kb~ = 1525 MB~ = 1.5GB
我在猜测最终的意图,但假设你想创建并允许用户使用非常详细的缩放来探索巨大的地图。 您应该创建自定义图像文件格式;你可以在文件中放入包含位图网格的各种图层,以加快渲染速度。渲染过程可以使用GDI DIB或GDI +创建部分图像,然后将它们一起渲染。当然,这需要一些实验/优化才能达到完美的用户感受。
祝你好运答案 3 :(得分:1)
为了将你的记忆力保持在可接受的范围内,你必须使用你的“分而治之”策略。这不是一个黑客,如果实施正确,它实际上是一种非常优雅的方式来处理无限大小的位图。如果您正确设计,您可以组合“图像的唯一渲染/显示部分”,“以低分辨率渲染整个图像以进行屏幕显示”和“将整个图像渲染到磁盘上的位图”方法一个引擎和盾牌用户的代码(很可能是你自己在两周内;))来自内部。我处理具有相同问题的产品:将(可能很大的)地图渲染到屏幕或.bmp文件。
答案 4 :(得分:0)
如果图像必须是这个分辨率 - 比如高分辨率扫描X射线 - 那么你可能想看看为它编写自定义假脱机程序 - 1.5 gb非常昂贵 - 即使对于现代桌面也是如此。 / p>
如果它是基于矢量的,那么您可以查看SVG,因为它支持视图端口,并且大多数允许您渲染为其他格式。我通过Batik(java)将SVG用于JPG,因此可以这样做。