I need to show bitmaps on my MFC/WinAPI application window. The bitmap size may be various – for instance 40MB, 100MB, 500MB, 700MB, 1GB, and more. Huge bitmaps that don’t fit into the application window should be shown with scrollbars.
The issue is the system can’t create a bitmap for some huge sizes even if memory is allocated via CreateFileMapping+CreateDIBSection.
Is there an approach to process such cases? I guess I need to divide my bitmaps on many small pieces, but I’m not sure this is the right way.
What size of a bitmap is not available for you to create? The limit you are likely to hit is virtual address space, which for 32-bit code is 2GB, 3GB or 4GB – depending on environment. The most straightforward solution is to move to 64-bit code.
To present this image you will perhaps want to implement a custom window/control which blits a portion of the source image into client area, and will manage scroll bars to enable user to navigate through the image. It is unlikely that there is any specificity in implementing such window compared to scollbar-enabled windows being developed for years. Scroll Bar Functions get you this.
Update on
CreateFileMapping/MapViewOfFile:The memory you allocate with
CreateFileMappingis not immediately mapped into process address space and this leaves you an option to allocate more than you can map. Note that Windows is not actually reserving real pages when satisfying the allocation request, the system only checks that such allocation is possible and will effectively allocate on demand later.You can use this simple probe tool FileMappingVirtualAddress.exe to see how the whole thing works and sort of estimate how much you can allocate in your app. The utility does as many
CreateFileMapping256 MB blocks on startup as possible, and by checking a box manually you doMapViewOfFileon already existing file mapping. You will be able to see that the real limit is virtual address space (2, 3 or 4 GB depending on environment) but it does not mean you cannot allocate more.Also note that if you request
MapViewOfFilefor a large block, the systems needs to satisfy this with a contiguous address block, so this address space needs to be available and space fragmentation might be a problem.With large bitmap you can make it in a way that you actually don’t need the full bitmap all the time and you can process the image tile by tile.
You can also trunctate download link and browse Trac for 64-bit version and 32-bit version built without /LARGEADDRESSAWARE to see how they are different in action.