Jak mogę przyspieszyć obracanie dużego TIFF o 90 stopni

Przetwarzam ogromne obrazy TIFF (w skali szarości, 8 lub 16 bitów, do 4 GB), które będą używane jako dane wejściowe o wysokiej rozdzielczości dla maszyny. Każdy obraz należy obrócić o 90 stopni (zgodnie z ruchem wskazówek zegara). Wejście TIFF może być LZW lub nieskompresowane, wyjście może być nieskompresowane.

Do tej pory zaimplementowałem własną klasę czytników TIFF w Objective C (w tym dekompresję LZW), która jest w stanie obsłużyć ogromne pliki, a także cache'ować pamięć. W tej chwili klasa czytników TIFF jest używana do wizualizacji i pomiaru wewnątrz obrazu i działa całkiem dobrze.

Do mojego najnowszego wyzwania, obracając TIFF, potrzebuję nowego podejścia, ponieważ obecna implementacja jest BARDZO powolna. Nawet w przypadku „średnich” rozmiarów TIFF (30 000 x 4 000) trwa to około. 30 minut, aby obrócić obraz. W tej chwili przechodzę przez wszystkie piksele i wybieram ten, który ma odwrócone współrzędne x i y, umieść je wszystkie w buforze i zapisz bufor na dysku, gdy tylko jedna linia zostanie ukończona. Głównym problemem jest odczyt z TIFF, ponieważ dane są zorganizowane w paski i nie ma gwarancji, że będą dystrybuowane liniowo wewnątrz pliku (aw przypadku skompresowanych pasków LZW nic nie jest również liniowe).

Wyprofilowałem moje oprogramowanie i odkryłem, że większość czasu spędzam na kopiowaniu bloków pamięci (memmove) i postanowiłem ominąć buforowanie wewnątrz mojej klasy czytnika dla rotacji. Teraz cały proces jest o 5% szybszy, co nie jest zbyt wiele, a cały czas jest teraz spędzany w fread (). Zakładam, że przynajmniej moja pamięć podręczna działa prawie tak dobrze, jak pamięć podręczna fread systemu.

Kolejny test z użyciem Image Magick z tym samym plikiem o rozmiarze 30 000 x 4.000 trwał tylko około 10 sekund. AFAIK Image Magick odczytuje cały plik do pamięci, przetwarza go w pamięci, a następnie zapisuje na dysku. Działa to dobrze do kilkuset megabajtów danych obrazu.

To, czego szukam, to pewnego rodzaju „optymalizacja meta”, podobnie jak inne podejście do obsługi danych pikseli. Czy jest inna strategia niż wymiana pikseli jeden po drugim (i konieczność czytania z lokalizacji plików daleko od siebie)? Czy powinienem utworzyć jakiś plik pośredni, aby przyspieszyć ten proces? Wszelkie sugestie mile widziane.

questionAnswers(2)

yourAnswerToTheQuestion