Как я могу ускорить вращение огромного TIFF на 90 градусов?

Я обрабатываю огромные изображения в формате TIFF (оттенки серого, 8 или 16 бит, до 4 ГБ) для использования в качестве входных данных высокого разрешения для машины. Каждое изображение необходимо повернуть на 90 градусов (по часовой стрелке). Входной TIFF может быть LZW или несжатый, выходной может быть несжатый.

До сих пор я реализовал свой собственный класс чтения TIFF в Objective C (включая декомпрессию LZW), который способен обрабатывать большие файлы и также выполнять некоторое кэширование в памяти. В настоящее время класс TIFF Reader используется для визуализации и измерения внутри изображения и работает довольно хорошо.

Для моей последней задачи - ротации TIFF, мне нужен новый подход, потому что текущая реализация ОЧЕНЬ медленная. Даже для TIFF «среднего» размера (30.000 x 4.000) требуется ок. 30 минут, чтобы повернуть изображение. В данный момент я перебираю все пиксели и выбираю один с обратными координатами x и y, помещаю их все в буфер и записываю буфер на диск, как только завершится одна строка. Основная проблема заключается в чтении из TIFF, поскольку данные организованы в виде полос и не гарантируют, что они будут линейно распределены внутри файла (а в случае сжатых полос LZW также нет ничего линейного).

Я профилировал свое программное обеспечение и обнаружил, что большую часть времени тратится на копирование блоков памяти (memmove), и решил обойти кеширование внутри моего класса читателя для ротации. Теперь весь процесс примерно на 5% быстрее, что не так уж много, и все время теперь проводится внутри fread (). Я предполагаю, что по крайней мере мой кеш работает почти так же хорошо, как системный кеш fread ().

Еще один тест с использованием Image Magick с тем же файлом 30.000 x 4.000 занял всего около 10 секунд. AFAIK Image Magick считывает весь файл в память, обрабатывает его в памяти и затем записывает обратно на диск. Это хорошо работает до нескольких сотен мегабайт данных изображения.

То, что я ищу, - это какая-то «мета-оптимизация», например, другой подход к обработке пиксельных данных. Есть ли другая стратегия, чем замена пикселов один за другим (и необходимость чтения из файлов, расположенных далеко друг от друга)? Должен ли я создать какой-нибудь промежуточный файл для ускорения процесса? Любые предложения приветствуются.

Ответы на вопрос(2)

Ваш ответ на вопрос