- 2014.06.06 11:11 "Re: [Tiff] What's wrong with my code for adding custom tags to a file", by Stephen Morris
2014.06.06 11:11 "Re: [Tiff] What's wrong with my code for adding custom tags to a file", by Stephen Morris
Thank you Paul. I incorporated the TiffSetTagExtender call in the way that you showed (which helped me a lot to make sense of the documentation) to produce the code shown below. Sure enough, the access violation has gone away but I still don¹t get the custom tags in the file. As the routine runs, I get error messages in my console to the effect of:
TIFFSetField: TestImage.tif: Unknown tag 65000.
TIFFSetField: TestImage.tif: Unknown tag 65001.
TIFFSetField: TestImage.tif: Unknown tag 65002.
TIFFSetField: TestImage.tif: Unknown tag 65003.
TIFFSetField: TestImage.tif: Unknown tag 65004.
TIFFSetField: TestImage.tif: Unknown tag 65005.
Šso there¹s obviously something that I¹m still missing. Here¹s my new code:
#include "stdafx.h"
#include "PGM.h"
#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 65005static 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 TIFFExtendProc parent_extender = NULL; // In case we want a chain of extensions
static void registerCustomTIFFTags(TIFF *tif) {
/* Install the extended Tag field info */
TIFFMergeFieldInfo(tif, xtiffFieldInfo, N(xtiffFieldInfo));
if (parent_extender)
(*parent_extender)(tif);
}
static void augment_libtiff_with_custom_tags() {
static bool first_time = true;
if (!first_time) return;
first_time = false;
parent_extender = TIFFSetTagExtender(registerCustomTIFFTags);
}
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");
// Prepare for writing the custom tags:
augment_libtiff_with_custom_tags();
// 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<e