Конвертировать несколько байтов [] в многостраничный эквивалент TIFF Image.SaveAdd без GDI + - PullRequest
1 голос
/ 04 декабря 2009

Я работаю в системе, которая хранит много изображений в базе данных в виде байта []. Каждый байт [] уже является многостраничным TIFF, но мне нужно извлечь изображения, преобразовав их все в один многостраничный TIFF. Ранее система использовала классы System.Drawing.Image с Save и SaveAdd - это было приятно, поскольку он сохранял файл постепенно, и, следовательно, использование памяти было минимальным, однако возникли проблемы с параллелизмом GDI + - это выполняется на серверной части в COM +.

Методы были преобразованы для использования классов System.Windows.Media.Imaging, TiffBitmapDecoder и TiffBitmapEncoder, с небольшим интервалом между ними. Это решило проблему параллелизма, но я изо всех сил пытаюсь найти способ постепенного сохранения изображения (т. Е. Кадр за кадром), чтобы ограничить использование памяти, и, следовательно, размер изображений, которыми можно манипулировать, намного ниже (т. Е. Я создал тест 1.2). Изображение GB, использующее классы GDI +, и могло бы продолжаться, но могло создать файл размером ~ 600 МБ, используя другой метод).

Есть ли способ постепенно сохранить многостраничное изображение tiff, чтобы избежать проблем с памятью? Если Save вызывается в TiffBitmapEncoder более одного раза, выдается ошибка.

Ответы [ 2 ]

1 голос
/ 04 февраля 2010

Я сделал это через LibTIFF.NET. Таким образом, я могу без проблем обрабатывать изображения размером в несколько гигабайт. Смотрите мой вопрос на

Использование LibTIFF из c # для доступа к мозаичным изображениям tiff

Хотя я использую его для плиточного доступа, проблемы с памятью аналогичны. LibTIFF обеспечивает полный доступ ко всем функциям TIFF, поэтому файлы могут быть прочитаны и сохранены в виде каталога.

Другая вещь, на которую стоит обратить внимание, это различия между GDI в разных версиях Windows. См. GDI .NET исключения .

1 голос
/ 04 декабря 2009

Думаю, я бы использовал стандартный способ .NET для декодирования изображений TIFF и написал бы свой собственный TIFF-кодировщик, который может постепенно записывать на диск. Спецификации формата TIFF являются общедоступными.

Расшифровать tiff не так просто, поэтому я бы использовал для этого TiffBitmapDecoder. Кодирование проще, поэтому я думаю, что выполнимо написать кодировщик, который можно передавать отдельными кадрами и который последовательно записывает необходимые данные на диск. Возможно, вам придется обновить заголовок полученного tiff, как только вы будете готовы обновить запись IFD (Каталог файлов изображений).

Удачи!

...