Попытка отобразить часть большого (2 ГБ) изображения Tiff в приложении Winform - PullRequest
2 голосов
/ 20 декабря 2011

Возможно ли это или я должен использовать WPF.Я новичок в Winforms и создал пару простых приложений, теперь мне нужно прочитать файл TIFF и затем отобразить его подраздел ...

Я попытался сделать что-то вроде этого:

Graphics g = e.Graphics;
Bitmap b = new Bitmap(Image.FromFile(@"W:\ILHSR_Merged_2011\compressed\overviews\ILHSR11_0405-101-1.tif"));
g.DrawImage(b, 10, 10, 350, 300);

Но я получаю из памяти исключения.Может кто-то укажет мне на чтение, или это просто то, что должно быть разработано в WPF.

Ответы [ 2 ]

4 голосов
/ 20 декабря 2011

Я думаю, вам нужно реализовать собственный загрузчик TIFF с использованием libTiff.

Формат изображения TIFF позволяет хранить данные изображения в тайлах. LibTiff позволяет загружать отдельные фрагменты: таким образом вы можете отображать только часть изображения (без декодирования всего TIFF !, который может иметь запретительные размеры).

К сожалению, я не думаю, что .NET Imaging поддерживает эту функцию TIFF. Я предлагаю заключить libTiff в библиотеку, написанную на C ++ / CLI, и интегрировать ее в ваше приложение.

(Комментарий: если какая-то существующая библиотека уже содержит libTiff, и ее интерфейс хорошо сочетается с вашим приложением, даже лучше)

2 голосов
/ 06 января 2012

Если вам необходимо отобразить детали, рассмотрите возможность использования мозаичных TIF-файлов и, возможно, даже пирамид изображений (см. TIF-пирамиду для получения справочной информации о том, как их создавать / использовать).Все это можно прочитать с помощью LibTiff и LibTiff.NET

Конечно, это зависит от того, как часто вам нужно это делать.Мой опыт показывает, что очень большие растровые изображения не могут отображаться должным образом с использованием 32-битных версий Windows, если сам файл не является мозаичным.Я сделал обертку для LibTiff.NET, которая позволяет Tile-доступу также для файлов без плиток (без сжатия или со строками).Конечно, тогда доступ медленнее;вам нужно прочитать все строки, которые отображаются на дисплее.Тем не менее, время отклика было разумным для гигапиксельных изображений.

BitMiracle LibTiff.NET, упомянутый в предыдущем посте / комментарии, прекрасно работает: см. Как реализовать панорамирование / масштабирование для гигапиксельных растровых изображений? и Какреализовать панорамирование / масштабирование гигапиксельных растровых изображений? ;это нативная реализация LibTiff для C #, с которой мне было проще работать, чем с классом-оберткой (поскольку в приложении c # нет неуправляемых блоков памяти, о которых нужно заботиться).

[Edit] Добавлена ​​ссылка на пирамиду TIFдокументация к изображениям [/ Edit]

...