2014.06.05 11:31 "[Tiff] What's wrong with my code for adding custom tags to a file", by Stephen Morris

2014.06.05 11:31 "[Tiff] What's wrong with my code for adding custom tags to a file", by Stephen Morris

Hello all; I¹m quite new to libtiff, but I¹ve managed to get tiff files saving and opening without much trouble.

Now, I¹m being ambitious and trying to add custom tags into my files. I¹ve read the documentation and written some test code which compiles without errors, but fails at runtime with an access violation at the first call to TIFFSetField that features a custom field (calls to TIFFSetField with standard fields are fine).

My test code follows: just under 100 lines, with the only external dependency (besides libtiff) being my code to open a test image from a .pgm file. Can anyone point out what I¹m doing wrong?

Many thanks.
Stephen.

‹‹‹‹‹‹‹‹‹

#include ³stdafx.h²   // Visual Studio default
#include ³PGM.h²      // Just for opening a test image

#include "tiffio.h"

// There are a number of TIFF-related definitions we need to make in order
to support the custom tags
// that we want to include in our files. The form of these definitions and
subroutines comes straight
// out of the libtiff documentation, and the values of the custom tags
themselves come from the
// range (65000-75535) defined in the TIFF specification as "reusable" and
suitable for private use
// within organisations. See
http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf
#define N(a) (sizeof(a) / sizeof (a[0]))

#define TIFFTAG_INCIDENTPOWER  65000
#define TIFFTAG_REFLECTEDPOWER    65001
#define TIFFTAG_T1             65002
#define TIFFTAG_T2             65003
#define TIFFTAG_HUMIDITY       65004
#define TIFFTAG_EXPOSURE       65005

static const TIFFFieldInfo xtiffFieldInfo[] = {
    { TIFFTAG_INCIDENTPOWER, -1, -1, TIFF_LONG, FIELD_CUSTOM, 0, 1,
const_cast<char*>("LaserIncidentPower") },
    { TIFFTAG_REFLECTEDPOWER, -1, -1, TIFF_LONG, FIELD_CUSTOM, 0, 1,
const_cast<char*>("LaserReflectedPower") },
    { TIFFTAG_T1, -1, -1, TIFF_FLOAT, FIELD_CUSTOM, 0, 1,
const_cast<char*>("Temperature_1") },
    { TIFFTAG_T2, -1, -1, TIFF_FLOAT, FIELD_CUSTOM, 0, 1,
const_cast<char*>("Temperature_2") },
    { TIFFTAG_HUMIDITY, -1, -1, TIFF_FLOAT, FIELD_CUSTOM, 0, 1,
const_cast<char*>("Humidity") },
    { TIFFTAG_EXPOSURE, -1, -1, TIFF_FLOAT, FIELD_CUSTOM, 0, 1,
const_cast<char*>("ExposureTime(ms)") }
}; //
The casts are necessary because the
                                                                      //
string literals are inherently const,
                                                                      //
but the definition of TIFFFieldInfo
                                                                      //
requires a non-const string pointer.
                                                                      //
The Intel and Microsoft compilers
                                                                      //
tolerate this, but gcc doesn't.

static void registerCustomTIFFTags(TIFF *tif) {
    /* Install the extended Tag field info */
    TIFFMergeFieldInfo(tif, xtiffFieldInfo, N(xtiffFieldInfo));
}

void saveAsTiff(int nx, int ny, unsigned short *image, const char* filename,

                int Power1, int Power2, float T1, float T2, float
Humidity, float Exposure)
{
    // Create the TIFF directory object:
    TIFF* tif = TIFFOpen(filename, "w");

    // Set the tags: first the standard ones...
    TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, nx);
    TIFFSetField(tif, TIFFTAG_IMAGELENGTH, ny);
    TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16);
    TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE);
    TIFFSetField(tif, TIFFTAG_ZIPQUALITY, 6); // Takes maximum advantage
of Intel ZLIB enhancements
    TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
    TIFFSetField(tif, TIFFTAG_ORIENTATION,
static_cast<int>(ORIENTATION_TOPLEFT));
    TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1);
    TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, ny);
    // Saving the whole image in a singl