Там какой-либо путь состоит в том, чтобы создать больше пространства, растрового / эффективного с точки зрения ресурсов растровый? В настоящее время я пытаюсь представить файл, приблизительно 800 пкс высотой но приблизительно 720000 пкс шириной. Это разрушает мое приложение, по-видимому, из-за емкости памяти доли битового массива.
Я могу сделать это более эффективно, как создание его как gif непосредственно и не позже, когда я сохраняю его?
Я пытаюсь сохранить серию строк/прямоугольников от чтения реального мира, и я хочу, чтобы это было 1 пкс в 1/100-ю из секунды.
Вам потребуется либо:
Принудительно установить среду x64 и загрузить стек оперативной памяти.
Измените архитектуру
Размер вашего изображения будет чуть больше 2 ГБ.
Вы должны помнить, что любое изображение, которое вы загружаете в память, независимо от того, GIF это или JPEG, или что-либо другое на диске, будет преобразовано в 32-битную битовую карту, что означает четыре байта на пиксель.
Это означает, что создаваемое вами изображение будет:
4 bytes * 800 pixels high * 720,000 pixels wide = 2,304,000,000 bytes
Пытаясь создать изображение такого размера, вы просто уничтожаете свою память.
Для всего, что вы пытаетесь сделать, ответом будет черепица и кэширование изображения.
Размер вашего образа составляет около 2,3 гигабайта, а самый большой объект .Net, который вы можете иметь, - 2 гигабайта, независимо от того, 32 или 64-битная машина.
Вам придется разбить растровое изображение на части, чтобы обработать изображение такого размера.
Могу ли я сделать это более эффективно, например, создать его как гифку напрямую, а не позже, когда я сохраню?
Вы можете сжать файл изображение, как вы его пишете. Он больше не будет в (несжатом / некодированном) формате "растрового изображения". Примеры алгоритмов сжатия включают "кодирование длины серии" и "Хаффмана".
Кроме того, используйте наименее возможный цвет - глубина: предпочтительно черно-белый, т.е. 1 бит на пиксель.
Также, возможно, сохраните его в нескольких, меньших, прерывистых фрагментах памяти: вместо одного огромного фрагмента памяти (настолько огромного, что его невозможно даже выделить в первую очередь).
Если вы создадите его как 720000 пикселей в высоту и 800 пикселей в ширину как BMP и поверните его при фактическом отображении (*), вы можете транслировать данные непосредственно в файл в виде растрового изображения. Может быть, использовать RLE вместо необработанного растрового изображения; В этом случае потоковая передача таким образом должна быть возможна.
(*) Отображение оставлено читателю в качестве упражнения. Вам понадобится плитка или что-то в этом роде.