Simple libtiff Example

First, you have to install libtiff. On Linux it’s almost certainly in your repository you should install a package with an name similar to libtiff-dev.

On MacOS X I did the following:

curl ftp://ftp.remotesensing.org/pub/libtiff/tiff-3.9.5.zip > tiff-3.9.5.zip
tar xvzf tiff-3.9.5.zip
cd tiff-3.9.5
./configure
make
sudo make install

Then create the following cpp file:

#include "tiffio.h"
#include <iostream>

using namespace std;

main(int argc, char* argv[])
{

  TIFF* tif = TIFFOpen(argv[1], "r");
  if (tif) {
    uint32 w, h;
    size_t npixels;
    uint32* raster;

    TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w);
    TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);
    npixels = w * h;

    raster = (uint32*) _TIFFmalloc(npixels * sizeof (uint32));
    if (raster != NULL) {
      if (TIFFReadRGBAImage(tif, w, h, raster, 0)) {


        cout << "P2" << endl;
        cout << w << " " << h << endl;
        cout << 255 << endl;

        for(size_t c_h=0;c_h<h;c_h++) {
          for(size_t c_w=0;c_w<w;c_w++) {
            cout << raster[(w*h)-((c_h*w)+(w-c_w))]%256 << " ";
          }
          cout << endl;
        }

      }
      _TIFFfree(raster);
    }
    TIFFClose(tif);
  }
}

This program converts a tiff file to a PGM (portable grey map) file. PGM is a simple text based format, this makes it very easy to debug. You can read more about PGM on wikipedia.

Note: It’s not converting the RGB value to grey very well it’s simply modding the value for the example.

Compile the program as follow (on MacOS you’ll need to have install XCode or another gcc version):

g++ tiffsimple.cpp -ltiff

Then run it as:

./a.out inputfile.tif

You can view the resulting PGM file with ImageMagick.

Notes

You can also transform the TIFF coordinates rather than performing the transformation yourself when converting to PGM as follows:

#include "tiffio.h"
#include <iostream>

using namespace std;

main(int argc, char* argv[])
{

  TIFF* tif = TIFFOpen(argv[1], "r");
  if (tif) {
    uint32 w, h;
    size_t npixels;
    uint32* raster;

    TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w);
    TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);
    npixels = w * h;

    raster = (uint32*) _TIFFmalloc(npixels * sizeof (uint32));
    if (raster != NULL) {
      if (TIFFReadRGBAImageOriented(tif, w, h, raster,ORIENTATION_TOPLEFT, 0)) {

        cout << "P2" << endl;
        cout << w << " " << h << endl;
        cout << 255 << endl;

        for(size_t c_h=0;c_h<h;c_h++) {
          for(size_t c_w=0;c_w<w;c_w++) {
     //       cout << raster[(w*h)-((c_h*w)+(w-c_w))]%256 << " ";
            cout << raster[(c_h*w)+c_w]%256 << " ";
          }
          cout << endl;
        }

      }
      _TIFFfree(raster);
    }
    TIFFClose(tif);
  }
}

2 thoughts on “Simple libtiff Example

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>