# BigTIFF Design

The classic TIFF file format uses 32bit offsets and, as such, is limited to 4 gigabytes. The BigTIFF design details a 64-bit (larger than 4GB) TIFF format specification. The design is based on a proposal by Steve Carlsen of Adobe, with input from various other parties.

## Overview of BigTIFF Extension

- The Version ID, in header bytes 2-3, formerly decimal 42, changes to 43 for BigTIFF.

- Header bytes 4-5 contain the decimal number 8.

  - If there is some other number here, a reader should give up.

  - This is to provide a nice way to move to 16-byte pointers some day.

- Header bytes 6-7 are reserved and must be zero.

  - If they're not, a reader should give up.

- Header bytes 8-15 contain the 8-byte offset to the first IFD.

- Value/Offset fields are 8 bytes long, and take up bytes 8-15 in an IFD entry.

  - If the value is ≤ 8 bytes, it must be stored in the field.

  - All values must begin at an 8-byte-aligned address.

- 8-byte offset to the Next_IFD, at the end of an IFD.

- To keep IFD entries 8-byte-aligned, we begin with an 8-byte (instead of 2-byte) count of the number of directory entries.

- Add `TIFFDataTypes` of `TIFF_LONG8` (= 16), an 8-byte unsigned int, and `TIFF_SLONG8` (= 17), an 8-byte signed int.

- Add `TIFFDataType` `TIFF_IFD8` (=18) an 8-byte IFD offset.

- `StripOffsets` and `TileOffsets` and `ByteCounts` may be `TIFF_LONG8` or the traditionally allowed `TIFF_LONG` or `TIFF_SHORT`.

- The proposed extension is `.tf8` or `.btf`, and call it "BigTIFF".

Otherwise, it's just like "original TIFF" or "classic TIFF".

## BigTIFF Structures compared to Classic TIFF

### TIFF and BigTIFF File Header

Here's the classic TIFF file header ...

Classic File Header
Offset | Datatype | Value
--- | --- | ---
0 | UInt16 | Byte order indication
2 | UInt16 | Version number (always 42)
4 | UInt32 | Offset to first IFD

And this is the BigTIFF file header ...

BigTIFF File Header
Offset | Datatype | Value
--- | --- | ---
0 | UInt16 | Byte order indication
2 | UInt16 | Version number, always 43 for BigTIFF
4 | UInt16 | Bytesize of offsets. Always 8 in BigTIFF, it provides a nice way to move to 16-byte pointers some day. If there is some other value here, a reader should give up.
6 | UInt16 | Reserved, always 0. If there is some other value here, a reader should give up.
8 | UInt64 | Offset to first IFD

The last members in both variants of the structure point to the first IFD (Image File Directory). This IFD can be located anywhere in the file. Every 'page' in a multi-page TIFF, classic TIFF or BigTIFF, is represented by exactly one IFD.

### TIFF and BigTIFF Image File Directory Structure

Here's a more detailed view of the classic IFD ...

Classic IFD
Offset | Datatype | Value
--- | --- | ---
0 | UInt16 | Number of tags in IFD
2 + x * 12 | Tag structure | Tag data
2 + (Number of tags in IFD) * 12 | UInt32 | Offset to next IFD, if there is a next IFD, 0 otherwise.

And this is how the IFD looks like in the BigTIFF file format ...

BigTIFF IFD
Offset | Datatype | Value
--- | --- | ---
0 | UInt64 | Number of tags in IFD
8 + x * 20 | Tag structure | Tag data
8 + (Number of tags in IFD) * 20 | UInt64 | Offset to next IFD, if there is a next IFD, 0 otherwise.

### TIFF and BigTIFF Tag Structure

The tags in this IFD should be sorted by code, in both classic TIFF and BigTIFF. Every tag takes up exactly 12 bytes in classic TIFF, and looks like this ...

Classic Tag Structure
Offset | Datatype | Value
--- | --- | ---
0 | UInt16 | Tag identifying code
2 | UInt16 | Datatype of tag data
4 | UInt32 | Number of values
8 | x * tag data datatype or UInt32 offset | Tag data or offset to tag data

This same tag structure, in BigTIFF, takes up 20 bytes, and looks like this ...

BigTIFF Tag Structure
Offset | Datatype | Value
--- | --- | ---
0 | UInt16 | Tag identifying code
2 | UInt16 | Datatype of tag data
4 | UInt64 | Number of values
12 | x * tag data datatype or UInt64 offset | Tag data or offset to tag data

The same rule for 'inlining' the tag data applies to both classic TIFF and BigTIFF, only the threshold size differs. In classic TIFF, the tag data was written inside the tag structure, in the IFD, if its size was smaller than or equal to 4 bytes. Otherwise, it's written elsewhere, and pointed to. In BigTIFF, the tag data is written inside the tag structure, in the IFD, if its size is smaller than or equal to 8 bytes.

## Other miscellaneous details

Amongst the suggested file extensions are 'tif', 'tf8' and 'btf'.

Three datatypes are added to classic TIFF:

- `TIFF_LONG8` = 16, being unsigned 8-byte (64-bit) integer

- `TIFF_SLONG8` = 17, being signed 8-byte (64-bit) integer

- `TIFF_IFD8` = 18, being a new unsigned 8-byte (64-bit) IFD offset.

The `StripOffsets`, `StripByteCounts`, `TileOffsets`, and `TileByteCounts` tags are allowed to have the datatype `TIFF_LONG8` in BigTIFF. Old datatypes `TIFF_LONG`, and `TIFF_SHORT` where allowed in the TIFF 6.0 specification, are still valid in BigTIFF, too.

Likewise, tags that point to other IFDs, like e.g. the SubIFDs tag, are now allowed to have the datatype `TIFF_IFD8` in BigTIFF. Again, the old datatypes TIFF_IFD, and the hardly recommendable `TIFF_LONG`, are still valid, too.

## Samples

BigTIFF sample file BigTIFFSamples.zip contains a series of 8 different BigTIFF files. Especially note the BigTIFFSamples.html file in this zip, documenting their characteristics.

That sample file from Joris Van Damme can still be found at the Wayback Machine: BigTIFF Example files