2004.11.05 17:17 "[Tiff] Append and read subifd", by Julien Demaria

Hi,

I try to append and read subifds to the first directory of an existing tiff file (little code in attachment) and it doesn't work with the current libtiff CVS (Linux).

Thanks in advance,

Julien

#include "tiff.h"
#include "tiffio.h"

int main(int argc, char **argv) {
    char *fout = argv[1];
    TIFF *tif, *tifr;
    unsigned char buf[24] = {0}, buf2[24] = {0};
    uint16 nb_ifds = 2, nb_ifds_read = 0;
    uint32 *offsets_ifds = NULL, *offsets_ifds_read = NULL;

    buf[0] = 22;
    buf[1] = 44;
    buf[2] = 55;

    tif = TIFFOpen(fout, "w");
    TIFFSetField( tif, TIFFTAG_BITSPERSAMPLE, 8 );
    TIFFSetField( tif, TIFFTAG_SAMPLESPERPIXEL, 1 );
    TIFFSetField( tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK );
    TIFFSetField( tif, TIFFTAG_IMAGEWIDTH, 4 );
    TIFFSetField( tif, TIFFTAG_IMAGELENGTH, 6 );
    TIFFSetField( tif, TIFFTAG_ROWSPERSTRIP, 6 );
    TIFFSetField( tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG );
    TIFFWriteEncodedStrip(tif, 0, buf, 24);
    TIFFClose(tif);

    tif = TIFFOpen(fout, "a");
    TIFFSetDirectory(tif, 0);
    offsets_ifds = (uint32 *) malloc(nb_ifds * sizeof(uint32));
    offsets_ifds[0] = 0;
    offsets_ifds[1] = 0;
    TIFFSetField(tif, TIFFTAG_SUBIFD, nb_ifds, offsets_ifds);
    TIFFRewriteDirectory(tif);

    TIFFSetField( tif, TIFFTAG_BITSPERSAMPLE, 8 );
    TIFFSetField( tif, TIFFTAG_SAMPLESPERPIXEL, 1 );
    TIFFSetField( tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK );
    TIFFSetField( tif, TIFFTAG_IMAGEWIDTH, 2 );
    TIFFSetField( tif, TIFFTAG_IMAGELENGTH, 3 );
    TIFFSetField( tif, TIFFTAG_ROWSPERSTRIP, 3 );
    TIFFSetField( tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG );
    TIFFWriteEncodedStrip(tif, 0, buf, 6);
    TIFFWriteDirectory(tif);

    tifr = TIFFOpen(fout, "r");
    if (!TIFFGetField(tifr, TIFFTAG_SUBIFD, &nb_ifds_read, &offsets_ifds_read))
        printf("error\n");
    else {
        printf("%d %d\n", offsets_ifds_read[0], offsets_ifds_read[1]);
        TIFFSetSubDirectory(tifr, offsets_ifds_read[0]);
    }
    TIFFSetField( tif, TIFFTAG_BITSPERSAMPLE, 8 );
    TIFFSetField( tif, TIFFTAG_SAMPLESPERPIXEL, 1 );
    TIFFSetField( tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK );
    TIFFSetField( tif, TIFFTAG_IMAGEWIDTH, 1 );
    TIFFSetField( tif, TIFFTAG_IMAGELENGTH, 1 );
    TIFFSetField( tif, TIFFTAG_ROWSPERSTRIP, 1 );
    TIFFSetField( tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG );
    TIFFReadEncodedStrip(tifr, 0, buf2, 6);
    TIFFWriteEncodedStrip(tif, 0, buf, 1);
    TIFFClose(tifr);
    TIFFClose(tif);

    return 0;
}