Обрезка большого TIFF-изображения .NET без считывания изображения в память - PullRequest
4 голосов
/ 10 февраля 2011

Я пытаюсь найти способ обрезать большие изображения в формате TIFF в .NET. В частности, я пытаюсь выполнить эту операцию на GeoTiff, TIFF, который позволяет встроить информацию о географической привязке в себя. Для тех, кто не знаком с этим типом набора данных, он полностью совместим с TIFF 6.0 и обычно огромен по размеру; много раз в диапазоне гигабайт.

Я возился с пространством имен System.Windows.Media.Imaging, чтобы попытаться выполнить эту задачу. Однако размер обрезки tiff приводит к ошибкам памяти. Может кто-нибудь указать мне какую-то информацию, показывающую, как обрезать изображение без чтения входного изображения в память с самого начала?

К вашему сведению - я полностью осознаю, что GDAL более чем способен для этой задачи. Однако, не вдаваясь в ненужные подробности, развертывание GDAL с моим приложением не является подходящим вариантом по нескольким причинам, поэтому я хочу сделать это с нативными классами .NET. Тем не менее, если есть другие сторонние библиотеки .NET, которые могут быть полезны, я весь в ушах.

Ответы [ 3 ]

3 голосов
/ 11 февраля 2011

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

Кажется, есть .NET-версия библиотеки , и похоже, что она бесплатная и с открытым исходным кодом (в отличие от некоторых других их приложений).

1 голос
/ 10 февраля 2011

Ни в коем случае нельзя рассматривать TIFF в гигабайтном диапазоне как «образ»: обрабатывать его как файл на диске или отображать в памяти и выполнять операции с ним, как если бы это был набор данных.

Пространство имен Imaging не предназначено для таких больших наборов данных, оно предназначено для работы с изображениями, изображениями меньшего размера и так далее. Вам нужно будет либо найти библиотеку манипуляций TIFF, либо написать свои собственные подпрограммы для работы на уровне файлов. Существует библиотека на основе C с открытым исходным кодом, которая называется libtiff, с которой я работал в прошлом; это может быть хорошей отправной точкой.

(Некоторые трудности, с которыми вам придется столкнуться при написании собственных файлов, включают в себя тот факт, что файлы TIFF могут иметь все виды сжатия - если это геотехническое, то, возможно, существует стандартное / простое сжатие или оно не сжато? В этом случае копирование памяти вокруг будет наиболее работы - это и сохранение каталогов и записей TIFF. Я бы посоветовал взглянуть на библиотеку Atalasoft DotImage, если вам нужен коммерческий вариант.)

1 голос
/ 10 февраля 2011

К сожалению, встроенные операции обработки изображений на основе GDI + (доступные в System.Drawing и System.Drawing.Imaging требуют загрузки полного изображения в память в какой-то момент. Это, очевидно, неосуществимо в вашей ситуации.

...