2010-04-24 3 views
0

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

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

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

ответ

1

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

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

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

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

2

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

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

+0

Спасибо, Пекка, я проверю составную функцию. Я не смогу отправить ImageMagick своим установщиком, поэтому прямое использование их функции не будет. –

+0

@ Давид, пожалуйста. Но если вы не можете отправлять даже внешние DLL-файлы, вам обязательно придется сворачивать свое собственное интеллектуальное решение для сшивания/замены, что, конечно же, невозможно, но орех взломать! Я уверен, что есть сшиватели с открытым исходным кодом с хорошим исходным кодом, чтобы получить хотя бы вдохновение. –

+0

Я написал небольшое консольное приложение, которое автоматически запускается. Это не занимало слишком много времени, но по-прежнему ограничено 2 ГБ несжатых данных изображения на 32-битных ОС. Тем не менее, я думаю, что это должно быть хорошо для большинства применений. –

Смежные вопросы