2011-12-15 113 views
1

我需要在MFC/WinAPI应用程序窗口上显示位图。位图大小可以是多种 - 例如40MB,100MB,500MB,700MB,1GB等等。不适合应用程序窗口的巨大位图应该用滚动条显示。处理巨大的位图

问题是,即使内存是通过CreateFileMapping + CreateDIBSection分配的,系统也无法为一些大尺寸创建位图。

是否有处理这种情况的方法吗?我想我需要将我的位图分成许多小块,但我不确定这是否正确。

+0

我会认真考虑一种分页技术(特别是对于非常大的图像!):考虑一个游戏,只有一小部分纹理(你看到的)会一次加载。此外,在这种情况下,“较低分辨率版本”等技术用于距离内的事物或(也可能是“加载时”)。当然,这在某种程度上使问题复杂化,并且特别是*使一些图像格式难以解码/加载成块。找到已经做了这个或写的图书馆 - 但不是真的!太复杂了! - 你自己的:-)(但也许预分割或格式友好的大规模图像?) – 2011-12-15 08:11:42

+1

WIC api擅长处理巨大的位图。获得64位版本的Windows是快速解决方案。 http://msdn.microsoft.com/en-us/library/windows/desktop/ee719655%28v=vs.85%29.aspx – 2011-12-15 09:59:09

回答

2

什么尺寸的位图的不可为你创造?您可能遇到的限制是虚拟地址空间,对于32位代码而言,它是2GB,3GB或4GB - 取决于环境。最直接的解决方案是转向64位代码。

呈现这个形象,你也许会想实现一个自定义窗口/控制该位块传输到客户端区域的源图像的一部分,并且将管理滚动条,使用户通过图像浏览。与开发多年的基于scollbar的窗口相比,实施这种窗口不太可能有任何特殊性。 Scroll Bar Functions给你这个。

更新上CreateFileMapping/MapViewOfFile

CreateFileMapping分配的内存不能立即映射到进程的地址空间,这让你一个选项,以分配超过您可以映射。请注意,Windows在满足分配请求时实际上并未预留实际页面,系统仅检查此类分配是否可行,并且稍后将按需分配。

你可以使用这个简单的探测工具FileMappingVirtualAddress.exe看到了整个事情的作品和排序如何估计有多少你可以在你的应用程序分配。该实用程序尽可能在启动时尽可能多地执行256 MB块,并通过手动选中一个框,在已有文件映射上执行MapViewOfFile。您将能够看到真正的限制是虚拟地址空间(取决于环境的2,3或4 GB),但这并不意味着您不能分配更多。

enter image description here

另外请注意,如果您申请MapViewOfFile一大块,该系统需要与一个连续的地址块,以满足这一点,所以这个地址空间必须是可用和空间碎片可能是一个问题。

对于大位图,您可以使其实际上不需要全部位图,并且可以通过切片处理图像切片。

您也可以通过trunctate下载链接浏览Trac以获取64位版本和32位版本,而不使用/LARGEADDRESSAWARE,以了解它们在行动方式上的差异。

+0

创建失败的位图大小为〜700MB。我已经通过CreateFileMapping成功创建了这个大小的句柄,但是CreateDIBSection失败(返回null)。我有WinXP 32bit与3,5GB内存,虚拟内存设置为4GB。 – Rom098 2011-12-15 09:10:21

0

Windows中的总GDI资源和单个位图大小是受限制的资源。同时,纯数组大小仅受虚拟地址空间和可用物理内存的限制。因此,您需要将整个图像保持为普通的像素阵列,只将所需的部分转换为GDI位图进行显示。