AWARE [SYSTEMS] Imaging expertise for the Delphi developer
AWare Systems, Imaging expertise for the Delphi developer, Home TIFF and LibTiff Mailing List Archive

LibTiff Mailing List

TIFF and LibTiff Mailing List Archive
December 2008

Previous Thread
Next Thread

Previous by Thread
Next by Thread

Previous by Date
Next by Date

Contact

The TIFF Mailing List Homepage
This list is run by Frank Warmerdam
Archive maintained by AWare Systems



Valid HTML 4.01!



2008.12.17 20:54 "Deleting tags from a directory", by Frank Warmerdam

Folks,

I have a client who needs to be able to remove a colormap from an existing
TIFF file.  This reveals a problem that has vexed me a number of times before
when trying to update TIFF files "in place".  There does not appear to be
any mechanism to delete a tag from an existing directory.

I propose, in libtiff4 to add a TIFFUnsetField() function which will remove
a tag from the current directory if present.  It would be implemented like
this:

/*
  * Clear the contents of the field in the internal structure.
  */
int
TIFFUnsetField(TIFF* tif, uint32 tag)
{
     const TIFFField *fip =  TIFFFieldWithTag(tif, tag);
     TIFFDirectory* td = &tif->tif_dir;

     if( !fip )
         return 0;

     if( fip->field_bit != FIELD_CUSTOM )
         TIFFClrFieldBit(tif, fip->field_bit);
     else
     {
         TIFFTagValue *tv;
         int i;

         for (i = 0; i < td->td_customValueCount; i++) {

             tv = td->td_customValues + i;
             if( tv->info->field_tag == tag )
                 break;
         }

         if( i < td->td_customValueCount )
         {
             _TIFFfree(tv->value);
             for( ; i < td->td_customValueCount-1; i++) {
                 td->td_customValues[i] = td->td_customValues[i+1];
             }
             td->td_customValueCount--;
         }
     }

     tif->tif_flags |= TIFF_DIRTYDIRECT;

     return (1);
}

Does anyone know of any problems with this change?  Is there already a
way for applications to remove tags I'm not aware of?  So far, I have
only tested the above a wee bit.  The following sample program demonstrates
turning a paletted file into unpaletted form:
#include "tiffio.h"

int main()

{
     TIFF *hTIFF;

     hTIFF = TIFFOpen( "cm.tif", "r+" );

     if( TIFFSetField( hTIFF, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK ) )
         printf( "Set photometric successful.\n" );
     else
         printf( "Set photometric failed.\n" );


     if( TIFFUnsetField( hTIFF, TIFFTAG_COLORMAP ) )
         printf( "clear colormap successful.\n" );
     else
         printf( "clear colormap failed.\n" );

     TIFFClose( hTIFF );
}



Best regards,
-- 
---------------------------------------+--------------------------------------
I set the clouds in motion - turn up   | Frank Warmerdam, warmerdam@pobox.com
light and sound - activate the windows | http://pobox.com/~warmerdam
and watch the world go round - Rush    | Geospatial Programmer for Rent