2005.12.12 22:19 "[Tiff] Writing EXIF data?", by Paul J. Lucas

2005.12.13 20:47 "Re: [Tiff] Writing EXIF data?", by Andrey Kiselev

On Tue, Dec 13, 2005 at 12:04:36PM -0800, Paul J. Lucas wrote:

> No it doesnt since all the offsets inside the EXIF IFD are > relative to its start.

For the sake of other mailing list subscribers and archive users: the above quote is incorrect information.

        No it isn't.  Here's proof.  Take the JPEG image at:

        http://homepage.mac.com/pauljlucas/temp/bugs054.jpg

Within that image, let's take the CameraMake EXIF tag (010F.H). It's located at absolute offset 0022.H. Seven bytes later at offset 002A.H is the offset value 0116.H. If you skip ahead to that offset treating it as absolute, you do *not* find the metadata for the camera make. The actual data is 12 bytes later at absolute offset 0122.H where it says "NIKON". The discrepancy is 12 bytes.

Inside a JPEG file, the EXIF metadata is inside the APP1 segment. This segment starts at absolute offset 0002.H where you find the bytes FF E1. Following that is the EXIF header for 10 bytes: those 10 plus the APP1 segment length is 12 bytes which exactly matches the discrepancy.

Therefore, all EXIF metadata offsets for tag values larger than 4 bytes are *relative* to the start of the EXIF metadata.

Paul,

That may have a sense for JPEG, but not for TIFF. Read the EXIF specification:

"Value Offset

This tag records the offset from the start of the TIFF header to the position where the value itself is recorded. In cases where the value fits in 4 bytes, the value itself is recorded. If the value is smaller than 4 bytes, the value is stored in the 4-byte area starting from the left, i.e., from the lower end of the byte offset area. For example, in big endian format, if the type is SHORT and the value is 1, it is recorded as 00010000.H."

Note, that it is absolutely clean on the subject of the start position for offsets. And that explains why it works differently for JPEG: take a look where TIFF header starts in your file (offset 0x000c). Good for JPEG, but in TIFFs things become more complicated.

Regards,

Andrey

--
Andrey V. Kiselev
ICQ# 26871517