Wie kann ich das Drehen eines riesigen TIFF um 90 Grad beschleunigen?

Ich verarbeite riesige TIFF-Bilder (Graustufen, 8 oder 16 Bit, bis zu 4 GB), um sie als hochauflösende Eingabedaten für ein Gerät zu verwenden. Jedes Bild muss um 90 Grad (im Uhrzeigersinn) gedreht werden. Der Eingang TIFF kann LZW oder unkomprimiert sein, der Ausgang kann unkomprimiert sein.

Bisher habe ich meine eigene TIFF-Leserklasse in Objective C (einschließlich LZW-Dekomprimierung) implementiert, die in der Lage ist, große Dateien zu verarbeiten und auch einige Caching-Vorgänge im Speicher durchzuführen. Momentan wird die TIFF-Leserklasse für die Visualisierung und Messung im Bild verwendet und bietet eine recht gute Leistung.

Für meine letzte Herausforderung, ein TIFF zu drehen, benötige ich einen neuen Ansatz, da die aktuelle Implementierung SEHR langsam ist. Selbst für ein "mittelgroßes" TIFF (30.000 x 4.000) sind ca. 30 Minuten, um das Bild zu drehen. Im Moment durchlaufe ich alle Pixel und wähle die mit den umgekehrten x- und y-Koordinaten, lege sie alle in einen Puffer und schreibe den Puffer auf die Festplatte, sobald eine Zeile vollständig ist. Das Hauptproblem ist das Lesen aus dem TIFF, da die Daten in Streifen organisiert sind und nicht garantiert linear in der Datei verteilt sind (und im Fall von LZW-komprimierten Streifen ist auch nichts linear).

Ich habe ein Profil für meine Software erstellt und festgestellt, dass die meiste Zeit für das Kopieren von Speicherblöcken (memmove) aufgewendet wird. Daher habe ich beschlossen, das Caching in meiner Reader-Klasse für die Rotation zu umgehen. Jetzt ist der gesamte Prozess ungefähr 5% schneller, was nicht zu viel ist, und die gesamte Zeit wird jetzt in fread () verbracht. Ich gehe davon aus, dass zumindest mein Cache fast so gut funktioniert wie der fread () -Cache des Systems.

Ein weiterer Test mit Image Magick mit derselben 30.000 x 4.000-Datei dauerte nur etwa 10 Sekunden. AFAIK Image Magick liest die gesamte Datei in den Speicher, verarbeitet sie im Speicher und schreibt sie dann auf die Festplatte zurück. Dies funktioniert gut bis zu einigen hundert Megabyte Bilddaten.

Was ich suche, ist eine Art "Meta-Optimierung", wie ein anderer Ansatz für den Umgang mit den Pixeldaten. Gibt es eine andere Strategie, als Pixel einzeln auszutauschen (und von weit voneinander entfernten Speicherorten zu lesen)? Soll ich eine Zwischendatei erstellen, um den Vorgang zu beschleunigen? Anregungen willkommen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage