Создание огромных изображений - PullRequest
0 голосов
/ 24 апреля 2010

В моей программе есть возможность экспортировать изображение высокого разрешения рабочего холста на диск. Пользователи будут часто пытаться экспортировать изображения размером около 20 000 x 10000 пикселей при 32bpp, что составляет около 800 МБ. Добавьте это к серьезному потреблению памяти, которое уже происходит в вашей обычной программе 3D CAD, и вы в значительной степени гарантируете сбой нехватки памяти на 32-битных платформах.

Итак, теперь я экспортирую плитки размером 1000x1000 пикселей, которые пользователь должен затем сшивать вместе в редакторе пикселей. Есть ли способ, которым я могу решить эту проблему, если пользователь не выполняет какую-либо работу?

Я подумал, что мог бы написать небольшой exe-файл, который вставлялся бы в процесс в командной строке и выполнял сшивание автоматически. Это будет отдельный процесс, и он будет иметь 2 Гб оперативной памяти. Или есть еще лучший способ? Я бы хотел поддерживать jpg, png и bmp, поэтому запись образа на диск в качестве байтового потока на самом деле невозможна.

Ответы [ 2 ]

2 голосов
/ 24 апреля 2010

ImageMagick имеет компонент с именем составной .В документах ничего не говорится о том, был ли этот инструмент создан для максимально эффективного использования памяти, но это не займет много времени, чтобы выяснить это.Страница загрузки здесь .IM доступен на всех основных платформах, поставляется с огромным количеством API и интерфейсов и, насколько я знаю, может использоваться как автономный EXE или как DLL.

Если вам не подходит композит, я уверен, что есть и другие инструменты.Этого, вероятно, будет проще всего достичь с помощью несжатых данных изображений - я не могу придумать, как соединить 4 JPEG-файла без их всех в памяти (хотя я уверен, что это уже сделано).

1 голос
/ 24 апреля 2010

Если вы хотите сделать это в зависимости от языка, у вас есть только два варианта:

  • Либо делай, как ты, либо
  • сделай это как профессиональную графику приложения делают это. Они держат изображения на диске в полном разрешении, но при загрузке / сохранении они не загрузить / сохранить полное изображение сразу но во время выполнения создать такой Подход на основе тайлов в памяти (и загружать / сохранять только те части, которые в данный момент актуальны).

Недостатком второго подхода является то, что вы должны развивать ВСЕ самостоятельно. Вы не можете использовать какую-либо обработку образа ОС, кодирование / декодирование изображений или что-либо еще.

У меня была подобная проблема некоторое время назад, и я мог решить ее, используя только 1 / 16bpp (тем более, что 32-битные изображения обычно содержат 8 полностью неиспользуемых битов, которые не нужно хранить в памяти - альфа-канал). Это означает, что у меня в основном были слои изображений 1bpp. Однако это, очевидно, работает только в том случае, если вы используете собственное приложение для потребления изображений.

...