Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Writing compressed tiled TIFF is broken since 1.4.8 #317

Open
nlinside opened this issue Dec 10, 2024 · 2 comments
Open

Writing compressed tiled TIFF is broken since 1.4.8 #317

nlinside opened this issue Dec 10, 2024 · 2 comments

Comments

@nlinside
Copy link

nlinside commented Dec 10, 2024

Writing compressed tiled TIFF is broken since 1.4.8. Here's why :

From TIFFImageWriter :

        // Write the image, a strip or tile at a time
        for (int tj = 0; tj < tilesDown; tj++) {
            for (int ti = 0; ti < tilesAcross; ti++) {
                long pos = stream.getStreamPosition();

                // Write the (possibly compressed) tile data

                Rectangle tileRect =
                    new Rectangle(sourceXOffset + ti*tileWidth*periodX,
                                  sourceYOffset + tj*tileLength*periodY,
                                  tileWidth*periodX,
                                  tileLength*periodY);
                // tileRect = tileRect.intersection(imageBounds); // XXX

                try {
                    int byteCount = writeTile(tileRect, compressor);

...

    private int writeTile(Rectangle tileRect, TIFFCompressor compressor)
        throws IOException {
...
                return compressor.encode(buf, 0,
                                         width, height, sampleSize,
                                         (tileRect.width + 7)/8);

From TIFFDeflater (used as the TIFFCompressor):

    public int encode(byte[] b, int off,
                      int width, int height,
                      int[] bitsPerSample,
                      int scanlineStride) throws IOException {
...
         // Previously on 1.4.7, "deflateCompressor.done()" was called, calling Deflater::reset()
         //   deflateCompressor.done();
        // Since 1.48, deflater is not reseted !!.
       // Be careful, deflateCompressor.done() doesn't call Deflater::reset() now !!

Problematic changes :

Image

@aaime
Copy link
Member

aaime commented Dec 10, 2024

Write a test that fails, and then write a fix, and then make a PR. We'll review and make sure to include in the next release (there is no schedule for it, but the fix will be in when it happens).

nlinside pushed a commit to nlinside/imageio-ext that referenced this issue Dec 11, 2024
# Liste des mots clés de titre de commit (version courte -> résultat long)
# i <slug>-<num> -> Récupération de l'issue Jira (Issue #<slug>-<num> : <titre_de_lissue>)
# t <titre> -> Technique : <titre>
# f <titre> -> Fix : <titre>
# ty <titre> -> Typo : <titre>
# d <titre> -> Doc : <titre>
# s <titre> -> Sécurité : <titre>
# u <titre> -> UI : <titre>
# c <titre> -> CI : <titre>
# dr <titre> -> Draft: <titre>
# [skip ci] en début de titre de commit permet de ne pas déclencher de build
#
# Chaque ligne de description ajouté sera préfixé automatiquement d'une puce.
#
# Pour la saisie de temps automatique lors de l'écriture d'un commit le format est le suivant :
# /spend <options>
#
# NB : Plusieurs /spend peuvent être défini sur un même commit
#
# Les options sont :
# - Temps en heure (ie 0.25). Obligatoire
# - Numéro de redmine. Facultatif si le commit porte sur un redmine avec la syntaxe courte ou longue.
# - Catégorie de l'imputation. Facultatif. Récupération par les premières lettres en format court, si non défini Développement sera utilisé
# - Date de l'imputation au format ISO8601 (ie 2021-02-23)
#
# NB : L'imputation n'est pas bloquante pour le message de commit si une erreur survient.
nlinside pushed a commit to nlinside/imageio-ext that referenced this issue Dec 11, 2024
@nlinside
Copy link
Author

@aaime Done.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants