Обработка огромных растровых изображений - PullRequest
1 голос
/ 15 декабря 2011

Мне нужно показать растровые изображения в окне приложения MFC / WinAPI. Размер растрового изображения может быть различным - например, 40 МБ, 100 МБ, 500 МБ, 700 МБ, 1 ГБ и более. Огромные растровые изображения, которые не помещаются в окно приложения, должны отображаться с полосами прокрутки.

Проблема в том, что система не может создать растровое изображение для некоторых огромных размеров, даже если память выделяется через CreateFileMapping + CreateDIBSection.

Есть ли подход к обработке таких дел? Думаю, мне нужно разделить мои растровые изображения на множество маленьких кусочков, но я не уверен, что это правильный путь.

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

Какой размер растрового изображения недоступен для создания? Ограничение, которое вы, вероятно, достигнете, - это виртуальное адресное пространство, которое для 32-битного кода составляет 2 ГБ, 3 ГБ или 4 ГБ - в зависимости от среды. Самое простое решение - перейти на 64-битный код.

Чтобы представить это изображение, вы, возможно, захотите реализовать собственное окно / элемент управления, который перетаскивает часть исходного изображения в клиентскую область и будет управлять полосами прокрутки, чтобы позволить пользователю перемещаться по изображению. Маловероятно, что есть какая-то специфика в реализации такого окна по сравнению с окнами с поддержкой прокрутки, которые разрабатываются годами. Функции полосы прокрутки Получите это.

Обновление CreateFileMapping / MapViewOfFile:

Память, которую вы выделяете с помощью CreateFileMapping, не сразу отображается в адресное пространство процесса, и это дает вам возможность выделить больше, чем вы можете отобразить. Обратите внимание, что Windows фактически не резервирует реальные страницы при выполнении запроса на выделение, система только проверяет, возможно ли такое размещение, и будет эффективно распределять по требованию позже.

Вы можете использовать этот простой инструмент зондирования FileMappingVirtualAddress.exe , чтобы увидеть, как все это работает, и оценить, сколько вы можете выделить в своем приложении. Утилита делает столько блоков CreateFileMapping 256 МБ при запуске, сколько стоит, и, установив флажок вручную, вы делаете MapViewOfFile для уже существующего сопоставления файлов. Вы сможете увидеть, что реальным ограничением является виртуальное адресное пространство (2, 3 или 4 ГБ в зависимости от среды), но это не значит, что вы не можете выделить больше.

enter image description here

Также обратите внимание, что если вы запрашиваете MapViewOfFile для большого блока, системы должны удовлетворить это с помощью непрерывного адресного блока, поэтому это адресное пространство должно быть доступно, и фрагментация пространства может стать проблемой.

С большим растровым изображением вы можете сделать так, чтобы вам не требовалось полное растровое изображение все время, и вы можете обрабатывать плитку изображения по плитке.

Вы также можете обрезать ссылку на скачивание и просмотреть Trac для 64-битной и 32-битной версии без / LARGEADDRESSAWARE , чтобы увидеть, как они отличаются в действии.

0 голосов
/ 15 декабря 2011

Общие ресурсы GDI и размер одного растрового изображения являются ограниченными ресурсами в Windows.В то же время размер обычного массива ограничен только виртуальным адресным пространством и доступной физической памятью.Таким образом, вам нужно сохранить все изображение в виде простого массива пикселей, преобразуя только необходимую часть в растровое изображение GDI для отображения.

...