Como posso acelerar a rotação de um enorme TIFF em 90 graus

Estou processando imagens TIFF enormes (escala de cinza, 8 ou 16 bits, até 4 GB) para serem usadas como dados de entrada de alta resolução para uma máquina. Cada imagem precisa ser girada em 90 graus (no sentido horário). O TIFF de entrada pode ser LZW ou descompactado, a saída pode ser descompactada.

Até agora eu implementei minha própria classe de leitor TIFF no Objective C (incluindo a descompactação LZW) que é capaz de manipular arquivos enormes e também faz algum cache na memória. No momento, a classe de leitura TIFF é usada para visualização e medição dentro da imagem e funciona muito bem.

Para meu último desafio, girando um TIFF, preciso de uma nova abordagem, porque a implementação atual é MUITO lenta. Mesmo para um TIFF de tamanho "médio" (30.000 x 4.000), leva aprox. 30 minutos para girar a imagem. No momento, percorro todos os pixels e escolho aquele com coordenadas X e Y invertidas, coloco todos eles em um buffer e escrevo o buffer no disco assim que uma linha é concluída. O principal problema é a leitura do TIFF, já que os dados são organizados em tiras e não são garantidamente distribuídos linearmente dentro do arquivo (e, no caso de tiras compactadas LZW, também nada é linear).

Eu analisei meu software e descobri que a maior parte do tempo é gasto na cópia de blocos de memória (memmove) e decidi ignorar o cache dentro da minha classe de leitura para a rotação. Agora todo o processo é cerca de 5% mais rápido, o que não é muito, e todo o tempo agora é gasto dentro do fread (). Eu suponho que pelo menos meu cache executa quase tão bem quanto o cache fread () do sistema.

Outro teste usando o Image Magick com o mesmo arquivo de 30.000 x 4.000 levou apenas cerca de 10 segundos para ser concluído. AFAIK Image Magick lê todo o arquivo na memória, processa-o na memória e grava de volta no disco. Isso funciona bem até algumas centenas de megabytes de dados de imagem.

O que estou procurando é algum tipo de "meta otimização", como uma outra abordagem para lidar com os dados de pixel. Existe outra estratégia do que trocar pixels um por um (e precisar ler de locais de arquivos distantes um do outro)? Devo criar algum arquivo intermediário para acelerar o processo? Qualquer sugestão bem-vinda.

questionAnswers(2)

yourAnswerToTheQuestion