[Major edit 14 января 10]
Меня немного смутило упоминание о плитках, когда tiff не выложен плиткой.
Я использую мозаичные / пирамидальные изображения TIFF. Я создал их с VIPS
vips im_vips2tiff source_image output_image.tif:none,tile:256x256,pyramid
Я думаю, что вы можете сделать это с:
vips im_vips2tiff source_image output_image.tif:none,tile:256x256,flat
Вы можете поэкспериментировать с размером плитки. Затем вы можете читать, используя TIFFReadEncodedTile.
Хранение в нескольких разрешениях с использованием пирамидальных символов намного быстрее, если вам нужно увеличить / уменьшить масштаб. Вы также можете использовать это, чтобы почти сразу же получить грубое изображение, а затем детальное изображение.
После переключения на мозаичное хранилище (подходящего размера) (которое принесет вам ОГРОМНОЕ улучшение производительности для произвольного доступа!), Вашим узким местом станет диск io. Чтение файлов происходит намного быстрее, если читать последовательно. Здесь mmapping может быть решением.
Некоторые полезные ссылки:
ВИПС
IIPImage
Перемещение в стеке LibTiff.NET
VIPS - это библиотека обработки изображений, которая может делать гораздо больше, чем просто читать / писать. У него есть собственный, очень эффективный внутренний формат. Имеет хорошую документацию по алгоритмам. Во-первых, он отделяет обработку от файловой системы, позволяя кэшировать тайлы.
IIPImage - это веб-сервер / библиотека браузера с несколькими зумами. Я нашел документацию очень хорошим источником информации по изображениям с несколькими разрешениями (например, карты Google)
Другое решение на этой странице, использующее mmap, эффективно только для «маленьких» файлов. Я часто сталкиваюсь с 32-битными границами. Как правило, выделение фрагмента памяти объемом 1 ГБ завершится неудачно на 32-разрядной ОС (с установленной 4 ГБ ОЗУ) из-за того, что даже виртуальная память разрушается после запуска одного или двух приложений. Тем не менее, достаточно памяти для кэширования частей или всего изображения. Больше памяти = больше производительности.