2002.08.22 22:17 "Problem Reading MultiPage TIFFs", by Steven Luke

2002.08.22 22:17 "Problem Reading MultiPage TIFFs", by Steven Luke

Hi,

I have a program in which I need to display multipage TIFFs on the screen, in a linked fashion so they can be scrolled through and processed as a group. The program was pre-written by someone else to read other file formats, and I have to edit it to work. My problem is, I don't seem to be able to read the differenent pages in the TIFF. I have all the code that matters at the bottom of the email, I would appreciate it if someone could help me with this, all I have been able to do is open the first page of the image over and over again.

One last thing (related probably). I have also had trouble counting the pages in the TIFF. I was using this code:

do
{ TIFFReadDirectory (tif);
   count++;
} while (!TIFFLastDirectory (tif));

but it would only give me a count of 1 (saying my first directory is my last one). But I know that the image had 20 pages to it. So I think I just don't have any idea how to use these functions. I would really like any help I could get.

Thanks,
Steve

--------------------Code for Opening Multipage TIFFs------------------------------------------

void LoadFile(char filename[])
{
   int i, ht;
   FILE *fptr;
   BITMAP *bmp;
   TIFF *tif;

   CODE TO OPEN FILE FOR INPUT, ETC...


   ht=LoadHeader(fptr);;

   if (ht==-1)
   {
      alert("Error!","Not a known image file","","OK",NULL,13,0);
      return;
   }
   else if (i == MM_TIFF) tif = TIFFOpen (filename, "r");

   sprintf(info.ts.startframe,"%d",0);
   sprintf(info.ts.endframe,"%d",info.f.tframes-1);



  MORE SETTING UP CODE


   for (i=0;i<info.f.tframes;i++)
   {
      if (i>info.ti.endframe) break;

      if (info.f.type == MM_TIFF)
     {
           info.f.currDir = i;
          TIFFSetDirectory (tif, TIFFCurrentDirectory (tif));
           bmp = read_tif (tif);
           TIFFReadDirectory (tif);
      }// end if MM_TIFF
     else
     { CODE FOR OTHER FILE TYPES }

     CODE FOR MANIPULATING POINTERS and DISPLAY

    } //End For Loop

   fclose(fptr);

} // End LoadFile

BITMAP *read_tif(TIFF *tif)
{
   unsigned int c,r,g,b;
   uint32 w, h;
   size_t npixels;
   uint32* raster;
   BITMAP* bmp;
   int x,y,n;

   bmp = (BITMAP*)NULL;
   if (tif)
  {
      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))
         {
            bmp = create_bitmap(w,h);

            n=0;
            for (y=h-1;y>=0;y--)
               for (x=0;x<w;x++)
               {  c = *(raster+(n++));
                  r = getr32(c);
                  g = getg32(c);
                  b = getb32(c);
                  c = makecol(b,g,r);
                  putpixel(bmp,x,y,c);
               } //End x For
         }//End TIFFRead good
         _TIFFfree(raster);
      }//End tif exists
   }//End if Raster good

  info.p.min = 65535;
  info.p.max = 0;
  return(bmp);
}//End read_tif

Steven J. Luke
Kimmel Cancer Center Bioimaging Facility
Thomas Jefferson University
Philadelphia, Pennsylvania