Tiff is an insanely flexible file format, offering an extensible "tag" system where you can create your own extensions to the format to store non-standard data that, in the style of HTML or AIFF, will simply be ignored by those applications lacking support for the extension in question. The standard specification, meanwhile, is simply huge-- among those features expected to be supported by a "standard" TIFF viewer are at least six different color modes including RGB and CMYK, several different compression methods ranging from raw uncompressed to LZW to JPEG to standard Fax format, multiple images (these are usually used as layers and sometimes thumbnails) per file, variable bit sizes per pixel in either floating point or integer format packed as either big or little-endian, an upper ceiling of 4GB per file, multiple methods of storing color calibration information.. the list goes on and on. As an understandable result of this, writing a program capable of writing to TIFF is fairly easy, but writing a program capable of reading TIFF is pure hell. About the only thing not included in standard TIFF is methods of vector information storage-- TIFF is a pure raster format. There is, however, nothing preventing you from writing your own extensions to handle postscript, etc.

TIFF gets prominent treatment in Photoshop and is accepted by pretty much everybody in any kind of graphics-related business. The complete tiff specification is available at libtiff.org.