PNG and MNG tools |
Copyright 2000, Glenn Randers-Pehrson, randeg@alum.rpi.edu, all rights reserved. The original document is available at http://pmt.sourceforge.net/exif/drafts/history/d007.html
You may link to this file or (preferably) to the directory in which it resides, but please do not publish this file on your web site without my permission. You may quote portions of this document, and the preceding editions, on web sites and in messages, provided that you include the copyright notice and a link to the original document. If and when this document emerges from draft status, it will be released on more generous terms, identical to those of the PNG extensions document [PNGEXT].
This is a draft of a proposal to the PNG Development Group for registration of a new text keyword (Exif) and a new special-purpose chunk (eXIF). It has not been approved by any approving body.
This document and the latest version of this document can be found at <http://pmt.sourceforge.net/exif>. If at some date the files move to another site, I intend to leave a link to the new location here, if possible.
This document proposes a new PNG [PNG] registered keyword, "Exif", and a new PNG special-purpose chunk, "eXIF". It shows how to use these to preserve the Exif information [EXIFFORMAT] that is present in a TIFF/EP [TIFF/EP] file, when converting the file to PNG or JNG [JNG] format (JNG is a sub-format of the MNG (Multiple-image Network Graphics) [MNG] format).
It is desireable to save the Exif information present in some camera images because
Some of the information, which describes the particulars of the encoding of the original image, are of no use once the image has been converted to another format, so these need not be preserved.
Applications that convert an image back to the original format need to know whether the image data has been changed, and must be able to rely on the saved Exif data being in a machine-readable format and to rely on the data being valid.
The PNG format does not presently formally accommodate Exif data. It could be stored in PNG text chunks, but a formal specification for storing Exif data is required, to ensure that the data will remain valid and be machine-readable.
A flag is desired by which applications can determine whether the image data might have been edited in a manner that invalidates the stored Exif data. The PNG specification provides copying rules that would allow a new "eXIF" chunk, which would not be recognized by current applications, to serve this purpose. Applications that modify the image data and do not recognize the eXIF chunk are required by the PNG specification to discard it, and applications that edit a PNG file without changing the image data are required to retain it; therefore, the presence or absence of the eXIF chunk serves as the desired flag.
Tags that provide details about the TIFF compression itself are no longer useful and are dropped. Other tags can be converted to existing PNG chunks, or to a tEXt/zTXt/iTXt chunk using the "Exif" keyword (i.e., a "textExif" chunk), as shown in this table.
Encodings:
| ||
TIFF/EP Tag | Exif Item Name | PNG encoding |
---|---|---|
0x0FE * | NewSubfileType | drop |
0x0FF * | SubfileType | drop |
0x100 | ImageWidth | width in IHDR and tE NUMBER [1] |
0x101 | ImageLength | height in IHDR and tE NUMBER |
0x102 | BitsPerSample | sBIT [2] |
0x103 | Compression | tE [3] |
0x106 | PhotometricInterpretation | tE |
0x10A | FillOrder | drop? [4] |
0x10D | DocumentName | text Title STRING |
0x10E | ImageDescription | text Description STRING |
0x10F | Make | tE N STRING |
0x110 | Model | tE N STRING |
0x111 | StripOffsets | drop |
0x112 | Orientation | [5] tE NUMBER |
0x115 | SamplesPerPixel | drop |
0x116 | RowsPerStrip | drop |
0x117 | StripByteCounts | drop |
0x11A | XResolution | xppm in pHYs[6] |
0x11B | YResolution | yppm in pHYs[6] |
0x11C | PlanarConfiguration | tE NUMBER |
0x128 | ResolutionUnit | unit=1 in pHYs[6] |
0x12D * | TransferFunction | [7] tE 3*NUMBER |
0x131 | Software | tE N STRING |
0x132 | DateTime | [8] text Creation time STRING |
0x13B | Artist | text Author STRING |
0x13D * | Predictor | drop |
0x13E | WhitePoint | white point in cHRM |
0x13F | PrimaryChromaticities | chromaticities in cHRM |
0x156 * | TransferRange | tE ? |
0x15B | JPEGTables | [9] drop |
0x200 | JPEGProc | drop |
0x201 | JPEGInterchangeFormat | drop |
0x202 | JPEGInterchangeFormatLength | drop |
0x211 | YCbCrCoefficients | [10] drop |
0x212 | YCbCrSubSampling | drop |
0x213 | YCbCrPositioning | drop |
0x214 | ReferenceBlackWhite | tE 2*NUMBER |
0x828D | CFARepeatPatternDim | tE 2*NUMBER |
0x828E | CFAPattern | CFArows*CFAcols*NUMBER |
0x828F | BatteryLevel | tE NUMBER or N STRING |
0x8298 | Copyright | text Copyright |
0x829A | ExposureTime | tE (1 or 2)*NUMBER |
0x829D | FNumber | tE (1 or 2)*NUMBER |
0x83BB | IPTC/NAA | tE NUMBER or N STRING |
0x8769 | ExifOffset | drop |
0x8773 | InterColorProfile | [11] iCCP |
0x8822 | ExposureProgram | tE NUMBER |
0x8824 | SpectralSensitivity | tE N STRING |
0x8825 | GPSInfo | write individual GPS tags as tE |
GPSVersionID | tE 4*NUMBER | |
GPSLatitudeRef | tE CHAR | |
GPSLatitude | tE 3*NUMBER | |
GPSLongitudeRef | tE CHAR | |
GPSLongitude | tE 3*NUMBER | |
GPSAltitudeRef | tE CHAR | |
GPSAltitude | tE NUMBER | |
GPSTimeStamp | tE 3*NUMBER | |
GPSSatellites | tE N STRING | |
GPSStatus | tE CHAR | |
GPSMeasureMode | tE CHAR | |
GPSSDOP | tE NUMBER | |
GPSSpeedRef | tE CHAR | |
GPSSpeed | tE NUMBER | |
GPSTrackRef | tE CHAR | |
GPSTrack | tE NUMBER | |
GPSImgDirectionRef | tE CHAR | |
GPSImgDirection | tE NUMBER | |
GPSMapDatum | tE N STRING | |
GPSDestLatitudeRef | tE CHAR | |
GPSDestLatitude | tE 3*NUMBER | |
GPSDestLongitudeRef | tE CHAR | |
GPSDestLongitude | tE 3*NUMBER | |
GPSDestBearingRef | tE CHAR | |
GPSDestBearing | tE NUMBER | |
GPSDestDistanceRef | tE CHAR | |
GPSDestDistance | tE NUMBER | |
0x8827 | ISOSpeedRatings | tE (1 or 2)*NUMBER |
0x8828 | OECF | [12] tE ... |
0x8829* | Interlace | drop |
0x882A | TimeZoneOffset | tE (1 or 2)*NUMBER |
0x882B | SelfTimerMode | tE NUMBER |
0x9000 | ExifVersion | tE 4*NUMBER |
0x9003 | DateTimeOriginal | [13] tE N STRING |
0x9004 | DateTimeDigitized | [14] tE N STRING |
0x9101 | ComponentsConfiguration | tE 4*NUMBER |
0x9102 | CompressedBitsPerPixel | tE NUMBER |
0x9201 | ShutterSpeedValue | tE NUMBER |
0x9202 | ApertureValue | tE NUMBER |
0x9203 | BrightnessValue | tE (1 or 2)*NUMBER |
0x9204 | ExposureBiasValue | tE (1 or 2)*NUMBER |
0x9205 | MaxApertureValue | tE NUMBER |
0x9206 | SubjectDistance | tE (1 or 2)*NUMBER |
0x9207 | MeteringMode | tE NUMBER |
0x9208 | LightSource | tE NUMBER |
0x9209 | Flash | tE NUMBER |
0x920A | FocalLength | tE (1 or 2)*NUMBER |
0x920B | FlashEnergy | [15] tE (1 or 2)*NUMBER |
0x920C | SpatialFrequencyResponse | tE N STRING |
0x920D | Noise | tE N STRING |
0x020E | FocalPlaneXResolution | tE NUMBER |
0x920F | FocalPlaneYResolution | tE NUMBER |
0x9210 | FocalPlaneResolutionUnit | tE NUMBER |
0x9211 | ImageNumber | tE NUMBER |
0x9212 | SecurityClassification | tEXt Warning Classified |
FileSecurityClassification | tE N STRING | |
FileCodewords | tE N STRING | |
FileControlAndHandling | tE N STRING | |
FileReleasingInstructions | tE N STRING | |
FileClassificationAuthority | tE N STRING | |
FileSecurityControlNumber | tE N STRING | |
FileSecurityDowngrade | tE N STRING | |
FileSecurityDowngradingEvent | tE N STRING | |
0x9213 | ImageHistory | tE N STRING |
0x9214 | SubjectLocation | tE (2, 3, or 4)*NUMBER |
0x9215 | ExposureIndex | tE (1 or 2)*number |
0x9216 | TIFF/EPStandardID | tE 4*NUMBER |
0x9217 | SensingMethod | tE NUMBER |
0x927C | MakerNote | [16]tE N HEX |
0x9286 | UserComment | text Comment/tE |
0x9290 | SubSecTime | tE N STRING |
0x9291 | SubSecTimeOriginal N STRING | tE |
0x9292 | SubSecTimeDigitized | tE N STRING |
0xA000 | FlashPixVersion | tE 4*NUMBER |
0xA001 | ColorSpace | tE NUMBER |
0xA002 | ExifImageWidth | tE NUMBER |
0xA003 | ExifImageLength | tE NUMBER |
0xA004* | RelatedSoundFile | tE N STRING |
0xA005 | InteroperabilityOffset | drop |
0xA20B* | FlashEnergy | [17] tE |
0xA20C* | SpatialFrequencyResponse | tE N STRING |
0xA20E* | FocalPlaneXResolution | tE NUMBER |
0xA20F* | FocalPlaneYResolution | tE NUMBER |
0xA210* | FocalPlaneResolutionUnit | tE NUMBER |
0xA214* | SubjectLocation | tE (2, 3, or 4)*NUMBER |
0xA215* | ExposureIndex | tE (1 or 2)*number |
0xA217* | SensingMethod | tE NUMBER |
0xA300* | FileSource | tE NUMBER |
0xA301* | SceneType | tE NUMBER |
The tag list was obtained from the exifdump source code
[EXIFDUMP], and compared with the tag list in the
TIFF/EP Standard [TIFF/EP]. See also the
"Description of the Exif file format" [EXIFFORMAT],
which was generated by inspection of Exif files, without reference to the actual
Exif specification [EXIFSPEC].
Notes: [*] Not in TIFF/EP [1] If the file is later cropped, don't change the textExif width and height; they record the original width and height. [2] The sBIT chunk is unnecessary and should not be written if the original file and the PNG file to which it is being converted have the same sample depth. [3] This identifies the compression method used in the original file. [4] Details about the original compression are of no further use and should be dropped. If an application converts the PNG file back to a TIFF/EP or ELIF file, it must supply these details with respect to the new file that it is creating. [5] This identifies the orientation of the original file. Converters should orient the pixels in the PNG or JNG file with the first pixel representing the top left corner of the image, using a lossless method of rotation. An application that converts a PNG or JNG back to TIFF/EP format must restore the image to an orientation that has the same width and height as the original, using a lossless method of rotation. If the eXIF chunk is present, its "current_orientation" field can be consulted to distinguish between right-side-up and upside-down images, and the application can either reorient the image or revise the value in the "Orientation" tag that it writes. [6] Resolution must be converted to meters [7] Is this related to gamma? If so, a gAMA chunk should be written. It is recorded in EV units, so it isn't directly gamma. [8] This is the time the image was originally recorded by the camera. But see also [12]; how do these tags differ? [9], [10] This information is recorded in the JPEG datastream. [11] If the ICC profile is the sRGB profile, then write an sRGB chunk instead of an iCCP chunk (note that DCF images are always in sRGB). [12] The OECF table is stored as tE rows columns n*header n*value where n=rows*columns. "rows" and "columns" are written as NUMBER, the n headers as STRING (with a newline terminating each), and the values are written as NUMBER. Newlines may be included in the final list of NUMBERs to improve readability; these newlines must be ignored by decoders. [13] A tIME chunk can also be written, containing the time that the image was first converted to the PNG or JNG format. If the image is later modified, the tIME chunk will be overwritten with the modification time. [14] A text "Creation time" chunk should also be written with this time. [15] Some of the TIFF tags 0x920B through 0x9217 are duplicates of 0xA20B through 0xA217. The former appear in the ISO Standard for TIFF/EP [TIFF/EP], but the latter have been written by some applications. [16] Since the contents of MakerNote are not known for all vendors, and since it can contain null-terminated strings, it is stored as a string of hex numbers preceded by a byte-count. It ends with a newline and can have embedded newlines which are to be ignored by decoders. [17] See [15]. |
All of the Exif information should be written in a single textExif chunk (multiple chunks can be used, provided that no particular tag appears in more than one of them), with a newline terminating the data for each item. In TIFF/EP tags whose data is a string ending with a null, the terminating null is replaced with a newline character, and embedded newlines are permitted. Converters must verify that the character-count field in tags that contain strings is correct, because the terminating null is not available for use by decoders. Any CRLF sequences in such strings are replaced with the newline character, and the character-count is adjusted accordingly. If any character outside the Latin-1 character set is present (which would violate the TIFF/EP Standard but might happen anyway), the strings must be converted to UTF-8 format and the iTXt chunk must be used. The data field of the text chunk must begin with the Exif keyword plus this caution not to edit the data manually:
Exif\0Caution: Do not manually edit the data in this chunk.\n
1 byte: editing_status 0: image has not been edited 1: image has been edited by an Exif-cognizant application 1 byte: current_orientation (1, 3, 6, 8, or 9) 2 bytes: (unsigned integer in network byte order) number of textExif chunks in the PNG datastream. 4 bytes: CRC of a textExif chunk 4 bytes: CRC of another textExif chunk etc., until the CRCs of all textExif chunks have been listed, in no particular order.
Applications that are cognizant of Exif and have edited the image data in a manner that does not invalidate the Exif data must either change the "editing_status" field to 1 or discard the chunk. If they make changes that invalidate the Exif data, they must discard the eXIF chunk.
If an application reorients an image, it must update the "current_orientation" field. If it edits the Exif "Orientation" tag, it must also update the eXIF chunk's "current_orientation" field, to maintain the proper relationship between the two values.
PNG-compliant applications that are not cognizant of Exif are required by the PNG specification to discard the eXIF chunk if they edit the PNG file in any manner that changes any critical chunk.
Applications that wish to determine the validity of the Exif data contained in the textExif chunks should check for the presence of an eXIF chunk. If none is present, it can be concluded that the file has been edited by an application that is not cognizant of Exif. If it is present, then it can be concluded that the Exif data is still valid. The "editing_status" field of the eXIF chunk can then be used to tell whether the image data was modified or not.
Do not write the eXIF chunk in any PNG files until it is registered, Until then, its specification is subject to change. For testing and evaluation purposes, write an "exIF" chunk (lower-case "x") instead, bearing in mind that the specification for the chunk might change..
Exif Item Name | PNG encoding | TIFF/EP Tag |
---|---|---|
ApertureValue | tE NUMBER | 0x9202 |
Artist | text Author STRING | 0x13B |
BatteryLevel | tE NUMBER or N STRING | 0x828F |
BitsPerSample | sBIT | 0x102 |
BrightnessValue | tE (1 or 2)*NUMBER | 0x9203 |
CFAPattern | CFArows*CFAcols*NUMBER | 0x828E |
CFARepeatPatternDim | tE 2*NUMBER | 0x828D |
ColorSpace | tE NUMBER | 0xA001 |
ComponentsConfiguration | tE 4*NUMBER | 0x9101 |
CompressedBitsPerPixel | tE NUMBER | 0x9102 |
Compression | tE | 0x103 |
Copyright | text Copyright | 0x8298 |
DateTime | text Creation time STRING | 0x132 |
DateTimeDigitized | tE N STRING | 0x9004 |
DateTimeOriginal | tE N STRING | 0x9003 |
DocumentName | text Title STRING | 0x10D |
ExifImageLength | tE NUMBER | 0xA003 |
ExifImageWidth | tE NUMBER | 0xA002 |
ExifOffset | none | 0x8769 |
ExifVersion | tE 4*NUMBER | 0x9000 |
ExposureBiasValue | tE (1 or 2)*NUMBER | 0x9204 |
ExposureIndex | tE (1 or 2)*number | 0x9215 |
ExposureIndex | tE (1 or 2)*number | 0xA215* |
ExposureProgram | tE NUMBER | 0x8822 |
ExposureTime | tE (1 or 2)*NUMBER | 0x829A |
FNumber | tE (1 or 2)*NUMBER | 0x829D |
FileClassificationAuthority | tE N STRING | none |
FileCodewordst | E N STRING | none |
FileControlAndHandling | tE N STRING | none |
FileReleasingInstructions | tE N STRING | none |
FileSecurityClassification | tE N STRING | none |
FileSecurityControlNumber | tE N STRING | none |
FileSecurityDowngrade | tE N STRING | none |
FileSecurityDowngradingEvent | tE N STRING | none |
FileSource | tE NUMBER | 0xA300* |
FillOrder | none | 0x10A |
Flash | tE NUMBER | 0x9209 |
FlashEnergy | tE | 0xA20B* |
FlashEnergy | tE (1 or 2)*NUMBER | 0x920B |
FlashPixVersion | tE 4*NUMBER | 0xA000 |
FocalLength | tE (1 or 2)*NUMBER | 0x920A |
FocalPlaneResolutionUnit | tE NUMBER | 0xA210* |
FocalPlaneResolutionUnit | tE NUMBER | 0x9210 |
FocalPlaneXResolution | tE NUMBER | 0xA20E* |
FocalPlaneXResolution | tE NUMBER | 0x020E |
FocalPlaneYResolution | tE NUMBER | 0x920F |
FocalPlaneYResolution | tE NUMBER | 0xA20F* |
GPSAltitude | tE NUMBER |   |
GPSAltitudeRef | tE CHAR |   |
GPSDestBearing | tE NUMBER |   |
GPSDestBearingRef | tE CHAR |   |
GPSDestDistance | tE NUMBER |   |
GPSDestDistanceRef | tE CHAR |   |
GPSDestLatitude | tE 3*NUMBER |   |
GPSDestLatitudeRef | tE CHAR |   |
GPSDestLongitude | tE 3*NUMBER |   |
GPSDestLongitudeRef | tE CHAR |   |
GPSImgDirection | tE NUMBER |   |
GPSImgDirectionRef | tE CHAR |   |
GPSInfo | write individual GPS tags as tE | 0x8825 |
GPSLatitude | tE 3*NUMBER |   |
GPSLatitudeRef | tE CHAR |   |
GPSLongitude | tE 3*NUMBER |   |
GPSLongitudeRef | tE CHAR |   |
GPSMapDatum | tE N STRING |   |
GPSMeasureMode | tE CHAR |   |
GPSSDOP | tE NUMBER |   |
GPSSatellites | tE N STRING |   |
GPSSpeed | tE NUMBER |   |
GPSSpeedRef | tE CHAR |   |
GPSStatus | tE CHAR |   |
GPSTimeStamp | tE 3*NUMBER |   |
GPSTrack | tE NUMBER |   |
GPSTrackRef | tE CHAR |   |
GPSVersionID | tE 4*NUMBER |   |
IPTC/NAA | tE NUMBER or N STRING | 0x83BB |
ISOSpeedRatings | tE (1 or 2)*NUMBER | 0x8827 |
ImageDescription | text Description STRING | 0x10E |
ImageHistory | tE N STRING | 0x9213 |
ImageLength | height in IHDR and tE NUMBER | 0x101 |
ImageNumber | tE NUMBER | 0x9211 |
ImageWidth | width in IHDR and tE NUMBER | 0x100 |
InterColorProfile | iCCP | 0x8773 |
Interlace | none | 0x8829* |
InteroperabilityOffset | none | 0xA005 |
JPEGInterchangeFormat | none | 0x201 |
JPEGInterchangeFormatLength | none | 0x202 |
JPEGProc | none | 0x200 |
JPEGTables | none | 0x15B |
LightSource | tE NUMBER | 0x9208 |
Make | tE N STRING | 0x10F |
MakerNote | tE N HEX | 0x927C |
MaxApertureValue | tE NUMBER | 0x9205 |
MeteringMode | tE NUMBER | 0x9207 |
Model | tE N STRING | 0x110 |
NewSubfileType | none | 0x0FE* |
Noise | tE N STRING | 0x920D |
OECF | tE ... | 0x8828 |
Orientation | tE NUMBER | 0x112 |
PhotometricInterpretation | tE | 0x106 |
PlanarConfiguration | tE NUMBER | 0x11C |
Predictor | none | 0x13D* |
PrimaryChromaticities | chromaticities in cHRM | 0x13F |
ReferenceBlackWhite | tE 2*NUMBER | 0x214 |
RelatedSoundFile | tE N STRING | 0xA004* |
ResolutionUnit | unit=1 in pHYs | 0x128 |
RowsPerStrip | none | 0x116 |
SamplesPerPixel | none | 0x115 |
SceneType | tE NUMBER | 0xA301* |
SecurityClassification | tEXt Warning Classified | 0x9212 |
SelfTimerMode | tE NUMBER | 0x882B |
SensingMethod | tE NUMBER | 0x9217 |
SensingMethod | tE NUMBER | 0xA217* |
ShutterSpeedValue | tE NUMBER | 0x9201 |
Software | tE N STRING | 0x131 |
SpatialFrequencyResponse | tE N STRING | 0x920C |
SpatialFrequencyResponse | tE N STRING | 0xA20C* |
SpectralSensitivity | tE N STRING | 0x8824 |
StripByteCounts | none | 0x117 |
StripOffsets | none | 0x111 |
SubSecTime | tE N STRING | 0x9290 |
SubSecTimeDigitized | tE N STRING | 0x9292 |
SubSecTimeOriginal N STRING | tE | 0x9291 |
SubfileType | none | 0x0FF* |
SubjectDistance | tE (1 or 2)*NUMBER | 0x9206 |
SubjectLocation | tE (2, 3, or 4)*NUMBER | 0x9214 |
SubjectLocation | tE (2, 3, or 4)*NUMBER | 0xA214* |
TIFF/EPStandardID | tE 4*NUMBER | 0x9216 |
TimeZoneOffset | tE (1 or 2)*NUMBER | 0x882A |
TransferFunction | tE 3*NUMBER | 0x12D* |
TransferRange | tE ? | 0x156* |
UserComment | text Comment/tE | 0x9286 |
WhitePoint | white point in cHRM | 0x13E |
XResolution | xppm in pHYs | 0x11A |
YCbCrCoefficients | none | 0x211 |
YCbCrPositioning | none | 0x213 |
YCbCrSubSampling | none | 0x212 |
YResolution | yppm in pHYs | 0x11B |
Software applications for converting to and from the PNG format are beyond the scope of this document. It is clearly evident that Thierry Bousch's exifdump [EXIFDUMP] software could be easily modified to do the job.
If you wish to write software to evaluate this proposal, you must not write eXIF chunks until this chunk type is registered by the PNG group. Instead, use a lower-case "x" to write an exIF chunk which has the same syntax as the proposed eXIF chunk but is a private unregistered chunk. Your software may read the eXIF chunk in anticipation of its approval, however, bearing in mind that the specification for the chunk might change.
[EXIFDUMP]
Bousch, Thierry, exifdump.py, v 1.13 (Python source
code for exifdump), 1999/08/21, available at
http://topo.math.u-psud.fr/~bousch/exifdump.py
[EXIFFORMAT]
Tachibanaya, TsuruZoh, "Description of Exif File Format",
Revision 1.2, July 19, 2000, available at
http://www.butaman.ne.jp/~tsuruzoh/Computer/Digicams/exif.html (Japanese)
http://www.butaman.ne.jp/~tsuruzoh/Computer/Digicams/exif-e.html (English)
[EXIFSPEC] Japan Electronic Industry Development Association (JEIDA), "Digital Still Camera Image File Format Standard (Exchangeable image file format for still cameras: Exif)", version 2.0, November 1997. I have not seen this formal specification of the EXIF format. It is not available on-line.
[JNG]
Randers-Pehrson, Glenn, et. al., "JNG (JPEG Network Graphics)
Specification, version 0.97, February, 2000, available at
ftp://swrinde.nde.swri.edu/pub/mng/documents.
[MNG]
Randers-Pehrson, Glenn, et. al., "MNG (Multiple-image Network
Graphics) Format, version 0.97", February, 2000, available at
ftp://swrinde.nde.swri.edu/pub/mng/documents.
[MNG-VLC]
Randers-Pehrson, Glenn, et. al., "MNG-VLC (Multiple-image Network
Graphics--Very Low Complexity) Format, version 0.97", February, 2000,
available at
ftp://swrinde.nde.swri.edu/pub/mng/documents.
[PNG]
Randers-Pehrson, Glenn, et. al., "PNG (Portable Network Graphics)
Specification, version 1.2", July, 1999, available at
ftp://swrinde.nde.swri.edu/pub/png/documents.
[PNGEXT]
Randers-Pehrson, Glenn, et. al., "Extensions to the PNG 1.2
Specification, version 1.2.0", July, 1999, available at
ftp://swrinde.nde.swri.edu/pub/png/documents.
[TIFF/EP]
ISO/DIS 12234-2, "Photography---Electronic still picture imaging---
Removable memory---Part 2: Image data format---TIFF/EP", November 24, 1998,
available at
http://www.pima.net/standards/iso/standards/documents/N4378.pdf