Suite

Connaissant l'adresse d'octet et la longueur d'octet de la "bande" dans GeoTiff compressé LZW avec PHP vanille ?


J'ai une situation où je dois lire les valeurs des cellules d'un GeoTiff à l'aide de vanilla PHP, et bien que j'aie réussi à lire les valeurs d'un TIF non compressé (~ 800 Mo), j'ai des difficultés à lire les valeurs du même TIF après la compression LZW (~80 Mo).

Je crois que mon problème vient de la connaissance de l'adresse d'octet d'une "bande" et du nombre d'octets appartenant à cette bande - car ma compréhension de LZW est que la routine de décompression a besoin d'une bande entière, qu'elle utilise pour créer une table de traduction relative à cette bande, avant que les valeurs de cellules individuelles représentées dans cette bande puissent être interrogées.

Voici comment j'interprète la spécification TIFF : je peux lire les octets de n'importe quelle "bande" en commençant par la valeur de la balise Strip Offsets (pour info : la valeur de ma balise RowsPerStrip est 1), et en obtenant le décalage pour la ligne de balayage exacte que je suis ciblage comme ceci :

$stripOffset = $STRIP_OFFSETS + ($rowNum * 4); // soit 2 octets par entrée

Ensuite, pour obtenir le nombre d'octets dont j'ai besoin pour lire à l'avance pour ma bande/ligne de balayage cible, je fais la même chose contre la balise StripByteCounts :

$stripByteCount = $STRIP_BYTE_COUNTS + ($rowNum * 4); // également 2 octets par entrée

Avec ces valeurs en main, je pensais pouvoir ensuite extraire toute la bande

// Ouvrir le fichier tiff et pointer sur l'adresse d'octet de la bande… fseek($this->fp, $stripOffset); // Lit N octets à partir de l'adresse d'octet de la bande $stripBytes = fread($this->fp, $stripByteCount); // CES OCTETS DEVRAIENT ÊTRE LA BANDE ENTIÈRE, non ? $strip_data = unpack('Vstrip_data', $stripBytes);

Cependant, il semble que j'obtienne plus d'une bande de données - car ce qui revient commence par, et a plusieurs instances récurrentes de128dans celui-ci, qui devrait représenter le soi-disant "ClearCode" mentionné dans la spécification.

"Le premier code écrit est un ClearCode, qui est défini comme étant le code 256."

Donc mon impression est que je ne comprends pas correctement comment évaluer l'adresse d'octet et/ou le nombre d'octets d'une bande/ligne de balayage… ou… je ne sais pas !?! :)… il est important de souligner que, ce qui revient en effet commence par 128, dont je suis relativement certain, c'est cette valeur ClearCode. Je soupçonne donc que je frappe le début d'une bande, je ne saisis tout simplement pas un nombre correct d'octets.

Est-ce que j'évalue correctement l'adresse d'octet et le nombre d'octets pour une bande/ligne de balayage cible ?

Et en supposant que non, qu'est-ce que je fais de mal ici ?

Comme mentionné - j'ai réussi à travailler avec des TIF non compressés en bénéficiant de cette question et de ce code, gracieuseté de Bob Osola. Par conséquent, je suis certain que ma traduction Est/Nord → Colonne/Ligne est correcte. Et FWIW, mon TIF compressé LZW a utilisé un Predictor=2 (différence horizontale), bien que j'aie une variation créée avec Predictor=1. Cela dit, je ne crois pas que le prédicteur soit un problème dans le contexte de cette question.


Voir la vidéo: Kirsi Alm Siira ja Susanna Nuoramo (Octobre 2021).