Thanks, Stefan. By reading the Java code, I was able to speculate how ImageJ saves TIFF files. It seems to me that ImageJ saves the first page at the beginning of the file. So, it’s basically IFD and then the single strip of grayscale values. Then, the strip data of the remaining pages are saved right after the first page. If the total file size is smaller than 4GB, the IFDs of the remaining pages are saved at the end of the file. Otherwise, the pointer to the next page in the first IFD is set to 0. That’s why it says other programs may only read the first page. To conclude, reading Image hyperstack is simple, the format is: header + IFD of the first page + raw data. The additional information needed to decode the raw data is found in the ImageDescription field of the IFD.
Also, BigTiFF is not implemented. BigTIFF uses 64bit addresses in the IFDs, which I think is more reasonable as an extension to the standard TIFF.