Эффективная обработка очень широкого, но не очень высокого растрового изображения? - PullRequest
5 голосов
/ 12 апреля 2010

Есть ли способ создать более эффективное использование пространства и ресурсов? В настоящее время я пытаюсь визуализировать файл высотой около 800 пикселей, но шириной около 720000 пикселей. Это приводит к сбою моего приложения, предположительно из-за размера разделяемой памяти растрового изображения.

Могу ли я сделать это более эффективно, например, создать его как gif-файл напрямую, а не позже, когда я сохраню его?

Я пытаюсь сохранить серию линий / прямоугольников из реального чтения, и я хочу, чтобы это было 1px на 1/100 секунды.

Ответы [ 5 ]

14 голосов
/ 12 апреля 2010

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

Это означает, что создаваемое вами изображение будет:

4 bytes * 800 pixels high * 720,000 pixels wide = 2,304,000,000 bytes

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

Что бы вы ни пытались выполнить, ответ - это разбиение и кэширование вашего изображения .

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

Ваше изображение составляет около 2,3 гигабайта, а самый большой объект .Net, который вы можете иметь, составляет 2 гигабайта, независимо от того, является ли машина 32 или 64-битной.

Вам нужно разбить растровое изображение на куски, чтобы обработать изображение такого размера.

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

Вам понадобится либо:

  • Принудительно использовать среду x64 и получить загрузку ОЗУ в стеке.

  • Изменить архитектуру

Ваше изображение будет чуть более 2 ГБ.

0 голосов
/ 12 апреля 2010

Если вы создадите его с высотой 720000px и шириной 800px как bmp и поверните его во время его отображения (*) Вы можете передавать данные напрямую в файл в виде растрового изображения. Возможно используйте RLE вместо необработанного растрового изображения; потоковая передача таким образом все еще должна быть возможной в этом случае.

(*) Показ его оставлен читателю в качестве упражнения. Вам понадобится плитка или что-то в этом роде.

0 голосов
/ 12 апреля 2010

Могу ли я сделать это более эффективно, например, создать его как GIF-файл напрямую, а не позже, когда я сохраню его?

Вы можете сжать изображение при его написании. Это больше не будет в (несжатом / незашифрованном) формате «растровое изображение». Примеры алгоритма сжатия включают в себя «кодирование по длине прогона» и «код Хаффмана».

Кроме того, используйте наименьшую возможную глубину цвета: предпочтительно черно-белую, то есть 1 бит на пиксель.

Также, возможно, сохраните его в нескольких меньших, прерывистых блоках памяти: вместо одного огромного блока памяти (такого огромного, что его даже нельзя выделить в первую очередь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...