diff options
author | Thomas Voss <mail@thomasvoss.com> | 2024-11-27 20:54:24 +0100 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2024-11-27 20:54:24 +0100 |
commit | 4bfd864f10b68b71482b35c818559068ef8d5797 (patch) | |
tree | e3989f47a7994642eb325063d46e8f08ffa681dc /doc/rfc/rfc2083.txt | |
parent | ea76e11061bda059ae9f9ad130a9895cc85607db (diff) |
doc: Add RFC documents
Diffstat (limited to 'doc/rfc/rfc2083.txt')
-rw-r--r-- | doc/rfc/rfc2083.txt | 5715 |
1 files changed, 5715 insertions, 0 deletions
diff --git a/doc/rfc/rfc2083.txt b/doc/rfc/rfc2083.txt new file mode 100644 index 0000000..19ffb94 --- /dev/null +++ b/doc/rfc/rfc2083.txt @@ -0,0 +1,5715 @@ + + + + + + +Network Working Group T. Boutell, et. al. +Request for Comments: 2083 Boutell.Com, Inc. +Category: Informational March 1997 + + + PNG (Portable Network Graphics) Specification + Version 1.0 + +Status of this Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + +IESG Note: + + The IESG takes no position on the validity of any Intellectual + Property Rights statements contained in this document. + +Abstract + + This document describes PNG (Portable Network Graphics), an + extensible file format for the lossless, portable, well-compressed + storage of raster images. PNG provides a patent-free replacement for + GIF and can also replace many common uses of TIFF. Indexed-color, + grayscale, and truecolor images are supported, plus an optional alpha + channel. Sample depths range from 1 to 16 bits. + + PNG is designed to work well in online viewing applications, such as + the World Wide Web, so it is fully streamable with a progressive + display option. PNG is robust, providing both full file integrity + checking and simple detection of common transmission errors. Also, + PNG can store gamma and chromaticity data for improved color matching + on heterogeneous platforms. + + This specification defines the Internet Media Type image/png. + +Table of Contents + + 1. Introduction .................................................. 4 + 2. Data Representation ........................................... 5 + 2.1. Integers and byte order .................................. 5 + 2.2. Color values ............................................. 6 + 2.3. Image layout ............................................. 6 + 2.4. Alpha channel ............................................ 7 + 2.5. Filtering ................................................ 8 + 2.6. Interlaced data order .................................... 8 + 2.7. Gamma correction ......................................... 10 + + + +Boutell, et. al. Informational [Page 1] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + 2.8. Text strings ............................................. 10 + 3. File Structure ................................................ 11 + 3.1. PNG file signature ....................................... 11 + 3.2. Chunk layout ............................................. 11 + 3.3. Chunk naming conventions ................................. 12 + 3.4. CRC algorithm ............................................ 15 + 4. Chunk Specifications .......................................... 15 + 4.1. Critical chunks .......................................... 15 + 4.1.1. IHDR Image header .................................. 15 + 4.1.2. PLTE Palette ....................................... 17 + 4.1.3. IDAT Image data .................................... 18 + 4.1.4. IEND Image trailer ................................. 19 + 4.2. Ancillary chunks ......................................... 19 + 4.2.1. bKGD Background color .............................. 19 + 4.2.2. cHRM Primary chromaticities and white point ........ 20 + 4.2.3. gAMA Image gamma ................................... 21 + 4.2.4. hIST Image histogram ............................... 21 + 4.2.5. pHYs Physical pixel dimensions ..................... 22 + 4.2.6. sBIT Significant bits .............................. 22 + 4.2.7. tEXt Textual data .................................. 24 + 4.2.8. tIME Image last-modification time .................. 25 + 4.2.9. tRNS Transparency .................................. 26 + 4.2.10. zTXt Compressed textual data ...................... 27 + 4.3. Summary of standard chunks ............................... 28 + 4.4. Additional chunk types ................................... 29 + 5. Deflate/Inflate Compression ................................... 29 + 6. Filter Algorithms ............................................. 31 + 6.1. Filter types ............................................. 31 + 6.2. Filter type 0: None ...................................... 32 + 6.3. Filter type 1: Sub ....................................... 33 + 6.4. Filter type 2: Up ........................................ 33 + 6.5. Filter type 3: Average ................................... 34 + 6.6. Filter type 4: Paeth...................................... 35 + 7. Chunk Ordering Rules .......................................... 36 + 7.1. Behavior of PNG editors .................................. 37 + 7.2. Ordering of ancillary chunks ............................. 38 + 7.3. Ordering of critical chunks .............................. 38 + 8. Miscellaneous Topics .......................................... 39 + 8.1. File name extension ...................................... 39 + 8.2. Internet media type ...................................... 39 + 8.3. Macintosh file layout .................................... 39 + 8.4. Multiple-image extension ................................. 39 + 8.5. Security considerations .................................. 40 + 9. Recommendations for Encoders .................................. 41 + 9.1. Sample depth scaling ..................................... 41 + 9.2. Encoder gamma handling ................................... 42 + 9.3. Encoder color handling ................................... 45 + 9.4. Alpha channel creation ................................... 47 + + + +Boutell, et. al. Informational [Page 2] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + 9.5. Suggested palettes ....................................... 48 + 9.6. Filter selection ......................................... 49 + 9.7. Text chunk processing .................................... 49 + 9.8. Use of private chunks .................................... 50 + 9.9. Private type and method codes ............................ 51 + 10. Recommendations for Decoders ................................. 51 + 10.1. Error checking .......................................... 52 + 10.2. Pixel dimensions ........................................ 52 + 10.3. Truecolor image handling ................................ 52 + 10.4. Sample depth rescaling .................................. 53 + 10.5. Decoder gamma handling .................................. 54 + 10.6. Decoder color handling .................................. 56 + 10.7. Background color ........................................ 57 + 10.8. Alpha channel processing ................................ 58 + 10.9. Progressive display ..................................... 62 + 10.10. Suggested-palette and histogram usage .................. 63 + 10.11. Text chunk processing .................................. 64 + 11. Glossary ..................................................... 65 + 12. Appendix: Rationale .......................................... 69 + 12.1. Why a new file format? .................................. 69 + 12.2. Why these features? ..................................... 70 + 12.3. Why not these features? ................................. 70 + 12.4. Why not use format X? ................................... 72 + 12.5. Byte order .............................................. 73 + 12.6. Interlacing ............................................. 73 + 12.7. Why gamma? .............................................. 73 + 12.8. Non-premultiplied alpha ................................. 75 + 12.9. Filtering ............................................... 75 + 12.10. Text strings ........................................... 76 + 12.11. PNG file signature ..................................... 77 + 12.12. Chunk layout ........................................... 77 + 12.13. Chunk naming conventions ............................... 78 + 12.14. Palette histograms ..................................... 80 + 13. Appendix: Gamma Tutorial ..................................... 81 + 14. Appendix: Color Tutorial ..................................... 89 + 15. Appendix: Sample CRC Code .................................... 94 + 16. Appendix: Online Resources ................................... 96 + 17. Appendix: Revision History ................................... 96 + 18. References ................................................... 97 + 19. Credits ......................................................100 + + + + + + + + + + + +Boutell, et. al. Informational [Page 3] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + +1. Introduction + + The PNG format provides a portable, legally unencumbered, well- + compressed, well-specified standard for lossless bitmapped image + files. + + Although the initial motivation for developing PNG was to replace + GIF, the design provides some useful new features not available in + GIF, with minimal cost to developers. + + GIF features retained in PNG include: + + * Indexed-color images of up to 256 colors. + * Streamability: files can be read and written serially, thus + allowing the file format to be used as a communications + protocol for on-the-fly generation and display of images. + * Progressive display: a suitably prepared image file can be + displayed as it is received over a communications link, + yielding a low-resolution image very quickly followed by + gradual improvement of detail. + * Transparency: portions of the image can be marked as + transparent, creating the effect of a non-rectangular image. + * Ancillary information: textual comments and other data can be + stored within the image file. + * Complete hardware and platform independence. + * Effective, 100% lossless compression. + + Important new features of PNG, not available in GIF, include: + + * Truecolor images of up to 48 bits per pixel. + * Grayscale images of up to 16 bits per pixel. + * Full alpha channel (general transparency masks). + * Image gamma information, which supports automatic display of + images with correct brightness/contrast regardless of the + machines used to originate and display the image. + * Reliable, straightforward detection of file corruption. + * Faster initial presentation in progressive display mode. + + PNG is designed to be: + + * Simple and portable: developers should be able to implement PNG + easily. + * Legally unencumbered: to the best knowledge of the PNG authors, + no algorithms under legal challenge are used. (Some + considerable effort has been spent to verify this.) + * Well compressed: both indexed-color and truecolor images are + compressed as effectively as in any other widely used lossless + format, and in most cases more effectively. + + + +Boutell, et. al. Informational [Page 4] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + * Interchangeable: any standard-conforming PNG decoder must read + all conforming PNG files. + * Flexible: the format allows for future extensions and private + add-ons, without compromising interchangeability of basic PNG. + * Robust: the design supports full file integrity checking as + well as simple, quick detection of common transmission errors. + + The main part of this specification gives the definition of the file + format and recommendations for encoder and decoder behavior. An + appendix gives the rationale for many design decisions. Although the + rationale is not part of the formal specification, reading it can + help implementors understand the design. Cross-references in the + main text point to relevant parts of the rationale. Additional + appendixes, also not part of the formal specification, provide + tutorials on gamma and color theory as well as other supporting + material. + + In this specification, the word "must" indicates a mandatory + requirement, while "should" indicates recommended behavior. + + See Rationale: Why a new file format? (Section 12.1), Why these + features? (Section 12.2), Why not these features? (Section 12.3), Why + not use format X? (Section 12.4). + + Pronunciation + + PNG is pronounced "ping". + +2. Data Representation + + This chapter discusses basic data representations used in PNG files, + as well as the expected representation of the image data. + + 2.1. Integers and byte order + + All integers that require more than one byte must be in network + byte order: the most significant byte comes first, then the less + significant bytes in descending order of significance (MSB LSB for + two-byte integers, B3 B2 B1 B0 for four-byte integers). The + highest bit (value 128) of a byte is numbered bit 7; the lowest + bit (value 1) is numbered bit 0. Values are unsigned unless + otherwise noted. Values explicitly noted as signed are represented + in two's complement notation. + + See Rationale: Byte order (Section 12.5). + + + + + + +Boutell, et. al. Informational [Page 5] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + 2.2. Color values + + Colors can be represented by either grayscale or RGB (red, green, + blue) sample data. Grayscale data represents luminance; RGB data + represents calibrated color information (if the cHRM chunk is + present) or uncalibrated device-dependent color (if cHRM is + absent). All color values range from zero (representing black) to + most intense at the maximum value for the sample depth. Note that + the maximum value at a given sample depth is (2^sampledepth)-1, + not 2^sampledepth. + + Sample values are not necessarily linear; the gAMA chunk specifies + the gamma characteristic of the source device, and viewers are + strongly encouraged to compensate properly. See Gamma correction + (Section 2.7). + + Source data with a precision not directly supported in PNG (for + example, 5 bit/sample truecolor) must be scaled up to the next + higher supported bit depth. This scaling is reversible with no + loss of data, and it reduces the number of cases that decoders + have to cope with. See Recommendations for Encoders: Sample depth + scaling (Section 9.1) and Recommendations for Decoders: Sample + depth rescaling (Section 10.4). + + 2.3. Image layout + + Conceptually, a PNG image is a rectangular pixel array, with + pixels appearing left-to-right within each scanline, and scanlines + appearing top-to-bottom. (For progressive display purposes, the + data may actually be transmitted in a different order; see + Interlaced data order, Section 2.6.) The size of each pixel is + determined by the bit depth, which is the number of bits per + sample in the image data. + + Three types of pixel are supported: + + * An indexed-color pixel is represented by a single sample + that is an index into a supplied palette. The image bit + depth determines the maximum number of palette entries, but + not the color precision within the palette. + * A grayscale pixel is represented by a single sample that is + a grayscale level, where zero is black and the largest value + for the bit depth is white. + * A truecolor pixel is represented by three samples: red (zero + = black, max = red) appears first, then green (zero = black, + max = green), then blue (zero = black, max = blue). The bit + depth specifies the size of each sample, not the total pixel + size. + + + +Boutell, et. al. Informational [Page 6] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Optionally, grayscale and truecolor pixels can also include an + alpha sample, as described in the next section. + + Pixels are always packed into scanlines with no wasted bits + between pixels. Pixels smaller than a byte never cross byte + boundaries; they are packed into bytes with the leftmost pixel in + the high-order bits of a byte, the rightmost in the low-order + bits. Permitted bit depths and pixel types are restricted so that + in all cases the packing is simple and efficient. + + PNG permits multi-sample pixels only with 8- and 16-bit samples, + so multiple samples of a single pixel are never packed into one + byte. 16-bit samples are stored in network byte order (MSB + first). + + Scanlines always begin on byte boundaries. When pixels have fewer + than 8 bits and the scanline width is not evenly divisible by the + number of pixels per byte, the low-order bits in the last byte of + each scanline are wasted. The contents of these wasted bits are + unspecified. + + An additional "filter type" byte is added to the beginning of + every scanline (see Filtering, Section 2.5). The filter type byte + is not considered part of the image data, but it is included in + the datastream sent to the compression step. + + 2.4. Alpha channel + + An alpha channel, representing transparency information on a per- + pixel basis, can be included in grayscale and truecolor PNG + images. + + An alpha value of zero represents full transparency, and a value + of (2^bitdepth)-1 represents a fully opaque pixel. Intermediate + values indicate partially transparent pixels that can be combined + with a background image to yield a composite image. (Thus, alpha + is really the degree of opacity of the pixel. But most people + refer to alpha as providing transparency information, not opacity + information, and we continue that custom here.) + + Alpha channels can be included with images that have either 8 or + 16 bits per sample, but not with images that have fewer than 8 + bits per sample. Alpha samples are represented with the same bit + depth used for the image samples. The alpha sample for each pixel + is stored immediately following the grayscale or RGB samples of + the pixel. + + + + + +Boutell, et. al. Informational [Page 7] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + The color values stored for a pixel are not affected by the alpha + value assigned to the pixel. This rule is sometimes called + "unassociated" or "non-premultiplied" alpha. (Another common + technique is to store sample values premultiplied by the alpha + fraction; in effect, such an image is already composited against a + black background. PNG does not use premultiplied alpha.) + + Transparency control is also possible without the storage cost of + a full alpha channel. In an indexed-color image, an alpha value + can be defined for each palette entry. In grayscale and truecolor + images, a single pixel value can be identified as being + "transparent". These techniques are controlled by the tRNS + ancillary chunk type. + + If no alpha channel nor tRNS chunk is present, all pixels in the + image are to be treated as fully opaque. + + Viewers can support transparency control partially, or not at all. + + See Rationale: Non-premultiplied alpha (Section 12.8), + Recommendations for Encoders: Alpha channel creation (Section + 9.4), and Recommendations for Decoders: Alpha channel processing + (Section 10.8). + + 2.5. Filtering + + PNG allows the image data to be filtered before it is compressed. + Filtering can improve the compressibility of the data. The filter + step itself does not reduce the size of the data. All PNG filters + are strictly lossless. + + PNG defines several different filter algorithms, including "None" + which indicates no filtering. The filter algorithm is specified + for each scanline by a filter type byte that precedes the filtered + scanline in the precompression datastream. An intelligent encoder + can switch filters from one scanline to the next. The method for + choosing which filter to employ is up to the encoder. + + See Filter Algorithms (Chapter 6) and Rationale: Filtering + (Section 12.9). + + 2.6. Interlaced data order + + A PNG image can be stored in interlaced order to allow progressive + display. The purpose of this feature is to allow images to "fade + in" when they are being displayed on-the-fly. Interlacing + slightly expands the file size on average, but it gives the user a + meaningful display much more rapidly. Note that decoders are + + + +Boutell, et. al. Informational [Page 8] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + required to be able to read interlaced images, whether or not they + actually perform progressive display. + + With interlace method 0, pixels are stored sequentially from left + to right, and scanlines sequentially from top to bottom (no + interlacing). + + Interlace method 1, known as Adam7 after its author, Adam M. + Costello, consists of seven distinct passes over the image. Each + pass transmits a subset of the pixels in the image. The pass in + which each pixel is transmitted is defined by replicating the + following 8-by-8 pattern over the entire image, starting at the + upper left corner: + + 1 6 4 6 2 6 4 6 + 7 7 7 7 7 7 7 7 + 5 6 5 6 5 6 5 6 + 7 7 7 7 7 7 7 7 + 3 6 4 6 3 6 4 6 + 7 7 7 7 7 7 7 7 + 5 6 5 6 5 6 5 6 + 7 7 7 7 7 7 7 7 + + Within each pass, the selected pixels are transmitted left to + right within a scanline, and selected scanlines sequentially from + top to bottom. For example, pass 2 contains pixels 4, 12, 20, + etc. of scanlines 0, 8, 16, etc. (numbering from 0,0 at the upper + left corner). The last pass contains the entirety of scanlines 1, + 3, 5, etc. + + The data within each pass is laid out as though it were a complete + image of the appropriate dimensions. For example, if the complete + image is 16 by 16 pixels, then pass 3 will contain two scanlines, + each containing four pixels. When pixels have fewer than 8 bits, + each such scanline is padded as needed to fill an integral number + of bytes (see Image layout, Section 2.3). Filtering is done on + this reduced image in the usual way, and a filter type byte is + transmitted before each of its scanlines (see Filter Algorithms, + Chapter 6). Notice that the transmission order is defined so that + all the scanlines transmitted in a pass will have the same number + of pixels; this is necessary for proper application of some of the + filters. + + Caution: If the image contains fewer than five columns or fewer + than five rows, some passes will be entirely empty. Encoders and + decoders must handle this case correctly. In particular, filter + type bytes are only associated with nonempty scanlines; no filter + type bytes are present in an empty pass. + + + +Boutell, et. al. Informational [Page 9] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + See Rationale: Interlacing (Section 12.6) and Recommendations for + Decoders: Progressive display (Section 10.9). + + 2.7. Gamma correction + + PNG images can specify, via the gAMA chunk, the gamma + characteristic of the image with respect to the original scene. + Display programs are strongly encouraged to use this information, + plus information about the display device they are using and room + lighting, to present the image to the viewer in a way that + reproduces what the image's original author saw as closely as + possible. See Gamma Tutorial (Chapter 13) if you aren't already + familiar with gamma issues. + + Gamma correction is not applied to the alpha channel, if any. + Alpha samples always represent a linear fraction of full opacity. + + For high-precision applications, the exact chromaticity of the RGB + data in a PNG image can be specified via the cHRM chunk, allowing + more accurate color matching than gamma correction alone will + provide. See Color Tutorial (Chapter 14) if you aren't already + familiar with color representation issues. + + See Rationale: Why gamma? (Section 12.7), Recommendations for + Encoders: Encoder gamma handling (Section 9.2), and + Recommendations for Decoders: Decoder gamma handling (Section + 10.5). + + 2.8. Text strings + + A PNG file can store text associated with the image, such as an + image description or copyright notice. Keywords are used to + indicate what each text string represents. + + ISO 8859-1 (Latin-1) is the character set recommended for use in + text strings [ISO-8859]. This character set is a superset of 7- + bit ASCII. + + Character codes not defined in Latin-1 should not be used, because + they have no platform-independent meaning. If a non-Latin-1 code + does appear in a PNG text string, its interpretation will vary + across platforms and decoders. Some systems might not even be + able to display all the characters in Latin-1, but most modern + systems can. + + Provision is also made for the storage of compressed text. + + See Rationale: Text strings (Section 12.10). + + + +Boutell, et. al. Informational [Page 10] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + +3. File Structure + + A PNG file consists of a PNG signature followed by a series of + chunks. This chapter defines the signature and the basic properties + of chunks. Individual chunk types are discussed in the next chapter. + + 3.1. PNG file signature + + The first eight bytes of a PNG file always contain the following + (decimal) values: + + 137 80 78 71 13 10 26 10 + + This signature indicates that the remainder of the file contains a + single PNG image, consisting of a series of chunks beginning with + an IHDR chunk and ending with an IEND chunk. + + See Rationale: PNG file signature (Section 12.11). + + 3.2. Chunk layout + + Each chunk consists of four parts: + + Length + A 4-byte unsigned integer giving the number of bytes in the + chunk's data field. The length counts only the data field, not + itself, the chunk type code, or the CRC. Zero is a valid + length. Although encoders and decoders should treat the length + as unsigned, its value must not exceed (2^31)-1 bytes. + + Chunk Type + A 4-byte chunk type code. For convenience in description and + in examining PNG files, type codes are restricted to consist of + uppercase and lowercase ASCII letters (A-Z and a-z, or 65-90 + and 97-122 decimal). However, encoders and decoders must treat + the codes as fixed binary values, not character strings. For + example, it would not be correct to represent the type code + IDAT by the EBCDIC equivalents of those letters. Additional + naming conventions for chunk types are discussed in the next + section. + + Chunk Data + The data bytes appropriate to the chunk type, if any. This + field can be of zero length. + + + + + + + +Boutell, et. al. Informational [Page 11] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + CRC + A 4-byte CRC (Cyclic Redundancy Check) calculated on the + preceding bytes in the chunk, including the chunk type code and + chunk data fields, but not including the length field. The CRC + is always present, even for chunks containing no data. See CRC + algorithm (Section 3.4). + + The chunk data length can be any number of bytes up to the + maximum; therefore, implementors cannot assume that chunks are + aligned on any boundaries larger than bytes. + + Chunks can appear in any order, subject to the restrictions placed + on each chunk type. (One notable restriction is that IHDR must + appear first and IEND must appear last; thus the IEND chunk serves + as an end-of-file marker.) Multiple chunks of the same type can + appear, but only if specifically permitted for that type. + + See Rationale: Chunk layout (Section 12.12). + + 3.3. Chunk naming conventions + + Chunk type codes are assigned so that a decoder can determine some + properties of a chunk even when it does not recognize the type + code. These rules are intended to allow safe, flexible extension + of the PNG format, by allowing a decoder to decide what to do when + it encounters an unknown chunk. The naming rules are not normally + of interest when the decoder does recognize the chunk's type. + + Four bits of the type code, namely bit 5 (value 32) of each byte, + are used to convey chunk properties. This choice means that a + human can read off the assigned properties according to whether + each letter of the type code is uppercase (bit 5 is 0) or + lowercase (bit 5 is 1). However, decoders should test the + properties of an unknown chunk by numerically testing the + specified bits; testing whether a character is uppercase or + lowercase is inefficient, and even incorrect if a locale-specific + case definition is used. + + It is worth noting that the property bits are an inherent part of + the chunk name, and hence are fixed for any chunk type. Thus, + TEXT and Text would be unrelated chunk type codes, not the same + chunk with different properties. Decoders must recognize type + codes by a simple four-byte literal comparison; it is incorrect to + perform case conversion on type codes. + + + + + + + +Boutell, et. al. Informational [Page 12] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + The semantics of the property bits are: + + Ancillary bit: bit 5 of first byte + 0 (uppercase) = critical, 1 (lowercase) = ancillary. + + Chunks that are not strictly necessary in order to meaningfully + display the contents of the file are known as "ancillary" + chunks. A decoder encountering an unknown chunk in which the + ancillary bit is 1 can safely ignore the chunk and proceed to + display the image. The time chunk (tIME) is an example of an + ancillary chunk. + + Chunks that are necessary for successful display of the file's + contents are called "critical" chunks. A decoder encountering + an unknown chunk in which the ancillary bit is 0 must indicate + to the user that the image contains information it cannot + safely interpret. The image header chunk (IHDR) is an example + of a critical chunk. + + Private bit: bit 5 of second byte + 0 (uppercase) = public, 1 (lowercase) = private. + + A public chunk is one that is part of the PNG specification or + is registered in the list of PNG special-purpose public chunk + types. Applications can also define private (unregistered) + chunks for their own purposes. The names of private chunks + must have a lowercase second letter, while public chunks will + always be assigned names with uppercase second letters. Note + that decoders do not need to test the private-chunk property + bit, since it has no functional significance; it is simply an + administrative convenience to ensure that public and private + chunk names will not conflict. See Additional chunk types + (Section 4.4) and Recommendations for Encoders: Use of private + chunks (Section 9.8). + + Reserved bit: bit 5 of third byte + Must be 0 (uppercase) in files conforming to this version of + PNG. + + The significance of the case of the third letter of the chunk + name is reserved for possible future expansion. At the present + time all chunk names must have uppercase third letters. + (Decoders should not complain about a lowercase third letter, + however, as some future version of the PNG specification could + define a meaning for this bit. It is sufficient to treat a + chunk with a lowercase third letter in the same way as any + other unknown chunk type.) + + + + +Boutell, et. al. Informational [Page 13] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Safe-to-copy bit: bit 5 of fourth byte + 0 (uppercase) = unsafe to copy, 1 (lowercase) = safe to copy. + + This property bit is not of interest to pure decoders, but it + is needed by PNG editors (programs that modify PNG files). + This bit defines the proper handling of unrecognized chunks in + a file that is being modified. + + If a chunk's safe-to-copy bit is 1, the chunk may be copied to + a modified PNG file whether or not the software recognizes the + chunk type, and regardless of the extent of the file + modifications. + + If a chunk's safe-to-copy bit is 0, it indicates that the chunk + depends on the image data. If the program has made any changes + to critical chunks, including addition, modification, deletion, + or reordering of critical chunks, then unrecognized unsafe + chunks must not be copied to the output PNG file. (Of course, + if the program does recognize the chunk, it can choose to + output an appropriately modified version.) + + A PNG editor is always allowed to copy all unrecognized chunks + if it has only added, deleted, modified, or reordered ancillary + chunks. This implies that it is not permissible for ancillary + chunks to depend on other ancillary chunks. + + PNG editors that do not recognize a critical chunk must report + an error and refuse to process that PNG file at all. The + safe/unsafe mechanism is intended for use with ancillary + chunks. The safe-to-copy bit will always be 0 for critical + chunks. + + Rules for PNG editors are discussed further in Chunk Ordering + Rules (Chapter 7). + + For example, the hypothetical chunk type name "bLOb" has the + property bits: + + bLOb <-- 32 bit chunk type code represented in text form + |||| + |||+- Safe-to-copy bit is 1 (lower case letter; bit 5 is 1) + ||+-- Reserved bit is 0 (upper case letter; bit 5 is 0) + |+--- Private bit is 0 (upper case letter; bit 5 is 0) + +---- Ancillary bit is 1 (lower case letter; bit 5 is 1) + + Therefore, this name represents an ancillary, public, safe-to-copy + chunk. + + + + +Boutell, et. al. Informational [Page 14] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + See Rationale: Chunk naming conventions (Section 12.13). + + 3.4. CRC algorithm + + Chunk CRCs are calculated using standard CRC methods with pre and + post conditioning, as defined by ISO 3309 [ISO-3309] or ITU-T V.42 + [ITU-V42]. The CRC polynomial employed is + + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1 + + The 32-bit CRC register is initialized to all 1's, and then the + data from each byte is processed from the least significant bit + (1) to the most significant bit (128). After all the data bytes + are processed, the CRC register is inverted (its ones complement + is taken). This value is transmitted (stored in the file) MSB + first. For the purpose of separating into bytes and ordering, the + least significant bit of the 32-bit CRC is defined to be the + coefficient of the x^31 term. + + Practical calculation of the CRC always employs a precalculated + table to greatly accelerate the computation. See Sample CRC Code + (Chapter 15). + +4. Chunk Specifications + + This chapter defines the standard types of PNG chunks. + + 4.1. Critical chunks + + All implementations must understand and successfully render the + standard critical chunks. A valid PNG image must contain an IHDR + chunk, one or more IDAT chunks, and an IEND chunk. + + 4.1.1. IHDR Image header + + The IHDR chunk must appear FIRST. It contains: + + Width: 4 bytes + Height: 4 bytes + Bit depth: 1 byte + Color type: 1 byte + Compression method: 1 byte + Filter method: 1 byte + Interlace method: 1 byte + + + + + + + +Boutell, et. al. Informational [Page 15] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Width and height give the image dimensions in pixels. They are + 4-byte integers. Zero is an invalid value. The maximum for each + is (2^31)-1 in order to accommodate languages that have + difficulty with unsigned 4-byte values. + + Bit depth is a single-byte integer giving the number of bits + per sample or per palette index (not per pixel). Valid values + are 1, 2, 4, 8, and 16, although not all values are allowed for + all color types. + + Color type is a single-byte integer that describes the + interpretation of the image data. Color type codes represent + sums of the following values: 1 (palette used), 2 (color used), + and 4 (alpha channel used). Valid values are 0, 2, 3, 4, and 6. + + Bit depth restrictions for each color type are imposed to + simplify implementations and to prohibit combinations that do + not compress well. Decoders must support all legal + combinations of bit depth and color type. The allowed + combinations are: + + Color Allowed Interpretation + Type Bit Depths + + 0 1,2,4,8,16 Each pixel is a grayscale sample. + + 2 8,16 Each pixel is an R,G,B triple. + + 3 1,2,4,8 Each pixel is a palette index; + a PLTE chunk must appear. + + 4 8,16 Each pixel is a grayscale sample, + followed by an alpha sample. + + 6 8,16 Each pixel is an R,G,B triple, + followed by an alpha sample. + + The sample depth is the same as the bit depth except in the + case of color type 3, in which the sample depth is always 8 + bits. + + Compression method is a single-byte integer that indicates the + method used to compress the image data. At present, only + compression method 0 (deflate/inflate compression with a 32K + sliding window) is defined. All standard PNG images must be + compressed with this scheme. The compression method field is + provided for possible future expansion or proprietary variants. + Decoders must check this byte and report an error if it holds + + + +Boutell, et. al. Informational [Page 16] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + an unrecognized code. See Deflate/Inflate Compression (Chapter + 5) for details. + + Filter method is a single-byte integer that indicates the + preprocessing method applied to the image data before + compression. At present, only filter method 0 (adaptive + filtering with five basic filter types) is defined. As with + the compression method field, decoders must check this byte and + report an error if it holds an unrecognized code. See Filter + Algorithms (Chapter 6) for details. + + Interlace method is a single-byte integer that indicates the + transmission order of the image data. Two values are currently + defined: 0 (no interlace) or 1 (Adam7 interlace). See + Interlaced data order (Section 2.6) for details. + + 4.1.2. PLTE Palette + + The PLTE chunk contains from 1 to 256 palette entries, each a + three-byte series of the form: + + Red: 1 byte (0 = black, 255 = red) + Green: 1 byte (0 = black, 255 = green) + Blue: 1 byte (0 = black, 255 = blue) + + The number of entries is determined from the chunk length. A + chunk length not divisible by 3 is an error. + + This chunk must appear for color type 3, and can appear for + color types 2 and 6; it must not appear for color types 0 and + 4. If this chunk does appear, it must precede the first IDAT + chunk. There must not be more than one PLTE chunk. + + For color type 3 (indexed color), the PLTE chunk is required. + The first entry in PLTE is referenced by pixel value 0, the + second by pixel value 1, etc. The number of palette entries + must not exceed the range that can be represented in the image + bit depth (for example, 2^4 = 16 for a bit depth of 4). It is + permissible to have fewer entries than the bit depth would + allow. In that case, any out-of-range pixel value found in the + image data is an error. + + For color types 2 and 6 (truecolor and truecolor with alpha), + the PLTE chunk is optional. If present, it provides a + suggested set of from 1 to 256 colors to which the truecolor + image can be quantized if the viewer cannot display truecolor + directly. If PLTE is not present, such a viewer will need to + select colors on its own, but it is often preferable for this + + + +Boutell, et. al. Informational [Page 17] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + to be done once by the encoder. (See Recommendations for + Encoders: Suggested palettes, Section 9.5.) + + Note that the palette uses 8 bits (1 byte) per sample + regardless of the image bit depth specification. In + particular, the palette is 8 bits deep even when it is a + suggested quantization of a 16-bit truecolor image. + + There is no requirement that the palette entries all be used by + the image, nor that they all be different. + + 4.1.3. IDAT Image data + + The IDAT chunk contains the actual image data. To create this + data: + + * Begin with image scanlines represented as described in + Image layout (Section 2.3); the layout and total size of + this raw data are determined by the fields of IHDR. + * Filter the image data according to the filtering method + specified by the IHDR chunk. (Note that with filter + method 0, the only one currently defined, this implies + prepending a filter type byte to each scanline.) + * Compress the filtered data using the compression method + specified by the IHDR chunk. + + The IDAT chunk contains the output datastream of the + compression algorithm. + + To read the image data, reverse this process. + + There can be multiple IDAT chunks; if so, they must appear + consecutively with no other intervening chunks. The compressed + datastream is then the concatenation of the contents of all the + IDAT chunks. The encoder can divide the compressed datastream + into IDAT chunks however it wishes. (Multiple IDAT chunks are + allowed so that encoders can work in a fixed amount of memory; + typically the chunk size will correspond to the encoder's + buffer size.) It is important to emphasize that IDAT chunk + boundaries have no semantic significance and can occur at any + point in the compressed datastream. A PNG file in which each + IDAT chunk contains only one data byte is legal, though + remarkably wasteful of space. (For that matter, zero-length + IDAT chunks are legal, though even more wasteful.) + + See Filter Algorithms (Chapter 6) and Deflate/Inflate + Compression (Chapter 5) for details. + + + + +Boutell, et. al. Informational [Page 18] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + 4.1.4. IEND Image trailer + + The IEND chunk must appear LAST. It marks the end of the PNG + datastream. The chunk's data field is empty. + + 4.2. Ancillary chunks + + All ancillary chunks are optional, in the sense that encoders need + not write them and decoders can ignore them. However, encoders + are encouraged to write the standard ancillary chunks when the + information is available, and decoders are encouraged to interpret + these chunks when appropriate and feasible. + + The standard ancillary chunks are listed in alphabetical order. + This is not necessarily the order in which they would appear in a + file. + + 4.2.1. bKGD Background color + + The bKGD chunk specifies a default background color to present + the image against. Note that viewers are not bound to honor + this chunk; a viewer can choose to use a different background. + + For color type 3 (indexed color), the bKGD chunk contains: + + Palette index: 1 byte + + The value is the palette index of the color to be used as + background. + + For color types 0 and 4 (grayscale, with or without alpha), + bKGD contains: + + Gray: 2 bytes, range 0 .. (2^bitdepth)-1 + + (For consistency, 2 bytes are used regardless of the image bit + depth.) The value is the gray level to be used as background. + + For color types 2 and 6 (truecolor, with or without alpha), + bKGD contains: + + Red: 2 bytes, range 0 .. (2^bitdepth)-1 + Green: 2 bytes, range 0 .. (2^bitdepth)-1 + Blue: 2 bytes, range 0 .. (2^bitdepth)-1 + + (For consistency, 2 bytes per sample are used regardless of the + image bit depth.) This is the RGB color to be used as + background. + + + +Boutell, et. al. Informational [Page 19] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + When present, the bKGD chunk must precede the first IDAT chunk, + and must follow the PLTE chunk, if any. + + See Recommendations for Decoders: Background color (Section + 10.7). + + 4.2.2. cHRM Primary chromaticities and white point + + Applications that need device-independent specification of + colors in a PNG file can use the cHRM chunk to specify the 1931 + CIE x,y chromaticities of the red, green, and blue primaries + used in the image, and the referenced white point. See Color + Tutorial (Chapter 14) for more information. + + The cHRM chunk contains: + + White Point x: 4 bytes + White Point y: 4 bytes + Red x: 4 bytes + Red y: 4 bytes + Green x: 4 bytes + Green y: 4 bytes + Blue x: 4 bytes + Blue y: 4 bytes + + Each value is encoded as a 4-byte unsigned integer, + representing the x or y value times 100000. For example, a + value of 0.3127 would be stored as the integer 31270. + + cHRM is allowed in all PNG files, although it is of little + value for grayscale images. + + If the encoder does not know the chromaticity values, it should + not write a cHRM chunk; the absence of a cHRM chunk indicates + that the image's primary colors are device-dependent. + + If the cHRM chunk appears, it must precede the first IDAT + chunk, and it must also precede the PLTE chunk if present. + + See Recommendations for Encoders: Encoder color handling + (Section 9.3), and Recommendations for Decoders: Decoder color + handling (Section 10.6). + + + + + + + + + +Boutell, et. al. Informational [Page 20] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + 4.2.3. gAMA Image gamma + + The gAMA chunk specifies the gamma of the camera (or simulated + camera) that produced the image, and thus the gamma of the + image with respect to the original scene. More precisely, the + gAMA chunk encodes the file_gamma value, as defined in Gamma + Tutorial (Chapter 13). + + The gAMA chunk contains: + + Image gamma: 4 bytes + + The value is encoded as a 4-byte unsigned integer, representing + gamma times 100000. For example, a gamma of 0.45 would be + stored as the integer 45000. + + If the encoder does not know the image's gamma value, it should + not write a gAMA chunk; the absence of a gAMA chunk indicates + that the gamma is unknown. + + If the gAMA chunk appears, it must precede the first IDAT + chunk, and it must also precede the PLTE chunk if present. + + See Gamma correction (Section 2.7), Recommendations for + Encoders: Encoder gamma handling (Section 9.2), and + Recommendations for Decoders: Decoder gamma handling (Section + 10.5). + + 4.2.4. hIST Image histogram + + The hIST chunk gives the approximate usage frequency of each + color in the color palette. A histogram chunk can appear only + when a palette chunk appears. If a viewer is unable to provide + all the colors listed in the palette, the histogram may help it + decide how to choose a subset of the colors for display. + + The hIST chunk contains a series of 2-byte (16 bit) unsigned + integers. There must be exactly one entry for each entry in + the PLTE chunk. Each entry is proportional to the fraction of + pixels in the image that have that palette index; the exact + scale factor is chosen by the encoder. + + Histogram entries are approximate, with the exception that a + zero entry specifies that the corresponding palette entry is + not used at all in the image. It is required that a histogram + entry be nonzero if there are any pixels of that color. + + + + + +Boutell, et. al. Informational [Page 21] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + When the palette is a suggested quantization of a truecolor + image, the histogram is necessarily approximate, since a + decoder may map pixels to palette entries differently than the + encoder did. In this situation, zero entries should not + appear. + + The hIST chunk, if it appears, must follow the PLTE chunk, and + must precede the first IDAT chunk. + + See Rationale: Palette histograms (Section 12.14), and + Recommendations for Decoders: Suggested-palette and histogram + usage (Section 10.10). + + 4.2.5. pHYs Physical pixel dimensions + + The pHYs chunk specifies the intended pixel size or aspect + ratio for display of the image. It contains: + + Pixels per unit, X axis: 4 bytes (unsigned integer) + Pixels per unit, Y axis: 4 bytes (unsigned integer) + Unit specifier: 1 byte + + The following values are legal for the unit specifier: + + 0: unit is unknown + 1: unit is the meter + + When the unit specifier is 0, the pHYs chunk defines pixel + aspect ratio only; the actual size of the pixels remains + unspecified. + + Conversion note: one inch is equal to exactly 0.0254 meters. + + If this ancillary chunk is not present, pixels are assumed to + be square, and the physical size of each pixel is unknown. + + If present, this chunk must precede the first IDAT chunk. + + See Recommendations for Decoders: Pixel dimensions (Section + 10.2). + + 4.2.6. sBIT Significant bits + + To simplify decoders, PNG specifies that only certain sample + depths can be used, and further specifies that sample values + should be scaled to the full range of possible values at the + sample depth. However, the sBIT chunk is provided in order to + store the original number of significant bits. This allows + + + +Boutell, et. al. Informational [Page 22] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + decoders to recover the original data losslessly even if the + data had a sample depth not directly supported by PNG. We + recommend that an encoder emit an sBIT chunk if it has + converted the data from a lower sample depth. + + For color type 0 (grayscale), the sBIT chunk contains a single + byte, indicating the number of bits that were significant in + the source data. + + For color type 2 (truecolor), the sBIT chunk contains three + bytes, indicating the number of bits that were significant in + the source data for the red, green, and blue channels, + respectively. + + For color type 3 (indexed color), the sBIT chunk contains three + bytes, indicating the number of bits that were significant in + the source data for the red, green, and blue components of the + palette entries, respectively. + + For color type 4 (grayscale with alpha channel), the sBIT chunk + contains two bytes, indicating the number of bits that were + significant in the source grayscale data and the source alpha + data, respectively. + + For color type 6 (truecolor with alpha channel), the sBIT chunk + contains four bytes, indicating the number of bits that were + significant in the source data for the red, green, blue and + alpha channels, respectively. + + Each depth specified in sBIT must be greater than zero and less + than or equal to the sample depth (which is 8 for indexed-color + images, and the bit depth given in IHDR for other color types). + + A decoder need not pay attention to sBIT: the stored image is a + valid PNG file of the sample depth indicated by IHDR. However, + if the decoder wishes to recover the original data at its + original precision, this can be done by right-shifting the + stored samples (the stored palette entries, for an indexed- + color image). The encoder must scale the data in such a way + that the high-order bits match the original data. + + If the sBIT chunk appears, it must precede the first IDAT + chunk, and it must also precede the PLTE chunk if present. + + See Recommendations for Encoders: Sample depth scaling (Section + 9.1) and Recommendations for Decoders: Sample depth rescaling + (Section 10.4). + + + + +Boutell, et. al. Informational [Page 23] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + 4.2.7. tEXt Textual data + + Textual information that the encoder wishes to record with the + image can be stored in tEXt chunks. Each tEXt chunk contains a + keyword and a text string, in the format: + + Keyword: 1-79 bytes (character string) + Null separator: 1 byte + Text: n bytes (character string) + + The keyword and text string are separated by a zero byte (null + character). Neither the keyword nor the text string can + contain a null character. Note that the text string is not + null-terminated (the length of the chunk is sufficient + information to locate the ending). The keyword must be at + least one character and less than 80 characters long. The text + string can be of any length from zero bytes up to the maximum + permissible chunk size less the length of the keyword and + separator. + + Any number of tEXt chunks can appear, and more than one with + the same keyword is permissible. + + The keyword indicates the type of information represented by + the text string. The following keywords are predefined and + should be used where appropriate: + + Title Short (one line) title or caption for image + Author Name of image's creator + Description Description of image (possibly long) + Copyright Copyright notice + Creation Time Time of original image creation + Software Software used to create the image + Disclaimer Legal disclaimer + Warning Warning of nature of content + Source Device used to create the image + Comment Miscellaneous comment; conversion from + GIF comment + + For the Creation Time keyword, the date format defined in + section 5.2.14 of RFC 1123 is suggested, but not required + [RFC-1123]. Decoders should allow for free-format text + associated with this or any other keyword. + + Other keywords may be invented for other purposes. Keywords of + general interest can be registered with the maintainers of the + PNG specification. However, it is also permitted to use + private unregistered keywords. (Private keywords should be + + + +Boutell, et. al. Informational [Page 24] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + reasonably self-explanatory, in order to minimize the chance + that the same keyword will be used for incompatible purposes by + different people.) + + Both keyword and text are interpreted according to the ISO + 8859-1 (Latin-1) character set [ISO-8859]. The text string can + contain any Latin-1 character. Newlines in the text string + should be represented by a single linefeed character (decimal + 10); use of other control characters in the text is + discouraged. + + Keywords must contain only printable Latin-1 characters and + spaces; that is, only character codes 32-126 and 161-255 + decimal are allowed. To reduce the chances for human + misreading of a keyword, leading and trailing spaces are + forbidden, as are consecutive spaces. Note also that the non- + breaking space (code 160) is not permitted in keywords, since + it is visually indistinguishable from an ordinary space. + + Keywords must be spelled exactly as registered, so that + decoders can use simple literal comparisons when looking for + particular keywords. In particular, keywords are considered + case-sensitive. + + See Recommendations for Encoders: Text chunk processing + (Section 9.7) and Recommendations for Decoders: Text chunk + processing (Section 10.11). + + 4.2.8. tIME Image last-modification time + + The tIME chunk gives the time of the last image modification + (not the time of initial image creation). It contains: + + Year: 2 bytes (complete; for example, 1995, not 95) + Month: 1 byte (1-12) + Day: 1 byte (1-31) + Hour: 1 byte (0-23) + Minute: 1 byte (0-59) + Second: 1 byte (0-60) (yes, 60, for leap seconds; not 61, + a common error) + + Universal Time (UTC, also called GMT) should be specified + rather than local time. + + + + + + + + +Boutell, et. al. Informational [Page 25] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + The tIME chunk is intended for use as an automatically-applied + time stamp that is updated whenever the image data is changed. + It is recommended that tIME not be changed by PNG editors that + do not change the image data. See also the Creation Time tEXt + keyword, which can be used for a user-supplied time. + + 4.2.9. tRNS Transparency + + The tRNS chunk specifies that the image uses simple + transparency: either alpha values associated with palette + entries (for indexed-color images) or a single transparent + color (for grayscale and truecolor images). Although simple + transparency is not as elegant as the full alpha channel, it + requires less storage space and is sufficient for many common + cases. + + For color type 3 (indexed color), the tRNS chunk contains a + series of one-byte alpha values, corresponding to entries in + the PLTE chunk: + + Alpha for palette index 0: 1 byte + Alpha for palette index 1: 1 byte + ... etc ... + + Each entry indicates that pixels of the corresponding palette + index must be treated as having the specified alpha value. + Alpha values have the same interpretation as in an 8-bit full + alpha channel: 0 is fully transparent, 255 is fully opaque, + regardless of image bit depth. The tRNS chunk must not contain + more alpha values than there are palette entries, but tRNS can + contain fewer values than there are palette entries. In this + case, the alpha value for all remaining palette entries is + assumed to be 255. In the common case in which only palette + index 0 need be made transparent, only a one-byte tRNS chunk is + needed. + + For color type 0 (grayscale), the tRNS chunk contains a single + gray level value, stored in the format: + + Gray: 2 bytes, range 0 .. (2^bitdepth)-1 + + (For consistency, 2 bytes are used regardless of the image bit + depth.) Pixels of the specified gray level are to be treated as + transparent (equivalent to alpha value 0); all other pixels are + to be treated as fully opaque (alpha value (2^bitdepth)-1). + + + + + + +Boutell, et. al. Informational [Page 26] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + For color type 2 (truecolor), the tRNS chunk contains a single + RGB color value, stored in the format: + + Red: 2 bytes, range 0 .. (2^bitdepth)-1 + Green: 2 bytes, range 0 .. (2^bitdepth)-1 + Blue: 2 bytes, range 0 .. (2^bitdepth)-1 + + (For consistency, 2 bytes per sample are used regardless of the + image bit depth.) Pixels of the specified color value are to be + treated as transparent (equivalent to alpha value 0); all other + pixels are to be treated as fully opaque (alpha value + (2^bitdepth)-1). + + tRNS is prohibited for color types 4 and 6, since a full alpha + channel is already present in those cases. + + Note: when dealing with 16-bit grayscale or truecolor data, it + is important to compare both bytes of the sample values to + determine whether a pixel is transparent. Although decoders + may drop the low-order byte of the samples for display, this + must not occur until after the data has been tested for + transparency. For example, if the grayscale level 0x0001 is + specified to be transparent, it would be incorrect to compare + only the high-order byte and decide that 0x0002 is also + transparent. + + When present, the tRNS chunk must precede the first IDAT chunk, + and must follow the PLTE chunk, if any. + + 4.2.10. zTXt Compressed textual data + + The zTXt chunk contains textual data, just as tEXt does; + however, zTXt takes advantage of compression. zTXt and tEXt + chunks are semantically equivalent, but zTXt is recommended for + storing large blocks of text. + + A zTXt chunk contains: + + Keyword: 1-79 bytes (character string) + Null separator: 1 byte + Compression method: 1 byte + Compressed text: n bytes + + The keyword and null separator are exactly the same as in the + tEXt chunk. Note that the keyword is not compressed. The + compression method byte identifies the compression method used + in this zTXt chunk. The only value presently defined for it is + 0 (deflate/inflate compression). The compression method byte is + + + +Boutell, et. al. Informational [Page 27] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + followed by a compressed datastream that makes up the remainder + of the chunk. For compression method 0, this datastream + adheres to the zlib datastream format (see Deflate/Inflate + Compression, Chapter 5). Decompression of this datastream + yields Latin-1 text that is identical to the text that would be + stored in an equivalent tEXt chunk. + + Any number of zTXt and tEXt chunks can appear in the same file. + See the preceding definition of the tEXt chunk for the + predefined keywords and the recommended format of the text. + + See Recommendations for Encoders: Text chunk processing + (Section 9.7), and Recommendations for Decoders: Text chunk + processing (Section 10.11). + + 4.3. Summary of standard chunks + + This table summarizes some properties of the standard chunk types. + + Critical chunks (must appear in this order, except PLTE + is optional): + + Name Multiple Ordering constraints + OK? + + IHDR No Must be first + PLTE No Before IDAT + IDAT Yes Multiple IDATs must be consecutive + IEND No Must be last + + Ancillary chunks (need not appear in this order): + + Name Multiple Ordering constraints + OK? + + cHRM No Before PLTE and IDAT + gAMA No Before PLTE and IDAT + sBIT No Before PLTE and IDAT + bKGD No After PLTE; before IDAT + hIST No After PLTE; before IDAT + tRNS No After PLTE; before IDAT + pHYs No Before IDAT + tIME No None + tEXt Yes None + zTXt Yes None + + + + + + +Boutell, et. al. Informational [Page 28] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Standard keywords for tEXt and zTXt chunks: + + Title Short (one line) title or caption for image + Author Name of image's creator + Description Description of image (possibly long) + Copyright Copyright notice + Creation Time Time of original image creation + Software Software used to create the image + Disclaimer Legal disclaimer + Warning Warning of nature of content + Source Device used to create the image + Comment Miscellaneous comment; conversion from + GIF comment + + 4.4. Additional chunk types + + Additional public PNG chunk types are defined in the document "PNG + Special-Purpose Public Chunks" [PNG-EXTENSIONS]. Chunks described + there are expected to be less widely supported than those defined + in this specification. However, application authors are + encouraged to use those chunk types whenever appropriate for their + applications. Additional chunk types can be proposed for + inclusion in that list by contacting the PNG specification + maintainers at png-info@uunet.uu.net or at png-group@w3.org. + + New public chunks will only be registered if they are of use to + others and do not violate the design philosophy of PNG. Chunk + registration is not automatic, although it is the intent of the + authors that it be straightforward when a new chunk of potentially + wide application is needed. Note that the creation of new + critical chunk types is discouraged unless absolutely necessary. + + Applications can also use private chunk types to carry data that + is not of interest to other applications. See Recommendations for + Encoders: Use of private chunks (Section 9.8). + + Decoders must be prepared to encounter unrecognized public or + private chunk type codes. Unrecognized chunk types must be + handled as described in Chunk naming conventions (Section 3.3). + +5. Deflate/Inflate Compression + + PNG compression method 0 (the only compression method presently + defined for PNG) specifies deflate/inflate compression with a 32K + sliding window. Deflate compression is an LZ77 derivative used in + zip, gzip, pkzip and related programs. Extensive research has been + done supporting its patent-free status. Portable C implementations + are freely available. + + + +Boutell, et. al. Informational [Page 29] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Deflate-compressed datastreams within PNG are stored in the "zlib" + format, which has the structure: + + Compression method/flags code: 1 byte + Additional flags/check bits: 1 byte + Compressed data blocks: n bytes + Check value: 4 bytes + + Further details on this format are given in the zlib specification + [RFC-1950]. + + For PNG compression method 0, the zlib compression method/flags code + must specify method code 8 ("deflate" compression) and an LZ77 window + size of not more than 32K. Note that the zlib compression method + number is not the same as the PNG compression method number. The + additional flags must not specify a preset dictionary. + + The compressed data within the zlib datastream is stored as a series + of blocks, each of which can represent raw (uncompressed) data, + LZ77-compressed data encoded with fixed Huffman codes, or LZ77- + compressed data encoded with custom Huffman codes. A marker bit in + the final block identifies it as the last block, allowing the decoder + to recognize the end of the compressed datastream. Further details + on the compression algorithm and the encoding are given in the + deflate specification [RFC-1951]. + + The check value stored at the end of the zlib datastream is + calculated on the uncompressed data represented by the datastream. + Note that the algorithm used is not the same as the CRC calculation + used for PNG chunk check values. The zlib check value is useful + mainly as a cross-check that the deflate and inflate algorithms are + implemented correctly. Verifying the chunk CRCs provides adequate + confidence that the PNG file has been transmitted undamaged. + + In a PNG file, the concatenation of the contents of all the IDAT + chunks makes up a zlib datastream as specified above. This + datastream decompresses to filtered image data as described elsewhere + in this document. + + It is important to emphasize that the boundaries between IDAT chunks + are arbitrary and can fall anywhere in the zlib datastream. There is + not necessarily any correlation between IDAT chunk boundaries and + deflate block boundaries or any other feature of the zlib data. For + example, it is entirely possible for the terminating zlib check value + to be split across IDAT chunks. + + + + + + +Boutell, et. al. Informational [Page 30] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + In the same vein, there is no required correlation between the + structure of the image data (i.e., scanline boundaries) and deflate + block boundaries or IDAT chunk boundaries. The complete image data + is represented by a single zlib datastream that is stored in some + number of IDAT chunks; a decoder that assumes any more than this is + incorrect. (Of course, some encoder implementations may emit files + in which some of these structures are indeed related. But decoders + cannot rely on this.) + + PNG also uses zlib datastreams in zTXt chunks. In a zTXt chunk, the + remainder of the chunk following the compression method byte is a + zlib datastream as specified above. This datastream decompresses to + the user-readable text described by the chunk's keyword. Unlike the + image data, such datastreams are not split across chunks; each zTXt + chunk contains an independent zlib datastream. + + Additional documentation and portable C code for deflate and inflate + are available from the Info-ZIP archives at + <URL:ftp://ftp.uu.net/pub/archiving/zip/>. + +6. Filter Algorithms + + This chapter describes the filter algorithms that can be applied + before compression. The purpose of these filters is to prepare the + image data for optimum compression. + + 6.1. Filter types + + PNG filter method 0 defines five basic filter types: + + Type Name + + 0 None + 1 Sub + 2 Up + 3 Average + 4 Paeth + + (Note that filter method 0 in IHDR specifies exactly this set of + five filter types. If the set of filter types is ever extended, a + different filter method number will be assigned to the extended + set, so that decoders need not decompress the data to discover + that it contains unsupported filter types.) + + The encoder can choose which of these filter algorithms to apply + on a scanline-by-scanline basis. In the image data sent to the + compression step, each scanline is preceded by a filter type byte + that specifies the filter algorithm used for that scanline. + + + +Boutell, et. al. Informational [Page 31] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Filtering algorithms are applied to bytes, not to pixels, + regardless of the bit depth or color type of the image. The + filtering algorithms work on the byte sequence formed by a + scanline that has been represented as described in Image layout + (Section 2.3). If the image includes an alpha channel, the alpha + data is filtered in the same way as the image data. + + When the image is interlaced, each pass of the interlace pattern + is treated as an independent image for filtering purposes. The + filters work on the byte sequences formed by the pixels actually + transmitted during a pass, and the "previous scanline" is the one + previously transmitted in the same pass, not the one adjacent in + the complete image. Note that the subimage transmitted in any one + pass is always rectangular, but is of smaller width and/or height + than the complete image. Filtering is not applied when this + subimage is empty. + + For all filters, the bytes "to the left of" the first pixel in a + scanline must be treated as being zero. For filters that refer to + the prior scanline, the entire prior scanline must be treated as + being zeroes for the first scanline of an image (or of a pass of + an interlaced image). + + To reverse the effect of a filter, the decoder must use the + decoded values of the prior pixel on the same line, the pixel + immediately above the current pixel on the prior line, and the + pixel just to the left of the pixel above. This implies that at + least one scanline's worth of image data will have to be stored by + the decoder at all times. Even though some filter types do not + refer to the prior scanline, the decoder will always need to store + each scanline as it is decoded, since the next scanline might use + a filter that refers to it. + + PNG imposes no restriction on which filter types can be applied to + an image. However, the filters are not equally effective on all + types of data. See Recommendations for Encoders: Filter selection + (Section 9.6). + + See also Rationale: Filtering (Section 12.9). + + 6.2. Filter type 0: None + + With the None filter, the scanline is transmitted unmodified; it + is only necessary to insert a filter type byte before the data. + + + + + + + +Boutell, et. al. Informational [Page 32] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + 6.3. Filter type 1: Sub + + The Sub filter transmits the difference between each byte and the + value of the corresponding byte of the prior pixel. + + To compute the Sub filter, apply the following formula to each + byte of the scanline: + + Sub(x) = Raw(x) - Raw(x-bpp) + + where x ranges from zero to the number of bytes representing the + scanline minus one, Raw(x) refers to the raw data byte at that + byte position in the scanline, and bpp is defined as the number of + bytes per complete pixel, rounding up to one. For example, for + color type 2 with a bit depth of 16, bpp is equal to 6 (three + samples, two bytes per sample); for color type 0 with a bit depth + of 2, bpp is equal to 1 (rounding up); for color type 4 with a bit + depth of 16, bpp is equal to 4 (two-byte grayscale sample, plus + two-byte alpha sample). + + Note this computation is done for each byte, regardless of bit + depth. In a 16-bit image, each MSB is predicted from the + preceding MSB and each LSB from the preceding LSB, because of the + way that bpp is defined. + + Unsigned arithmetic modulo 256 is used, so that both the inputs + and outputs fit into bytes. The sequence of Sub values is + transmitted as the filtered scanline. + + For all x < 0, assume Raw(x) = 0. + + To reverse the effect of the Sub filter after decompression, + output the following value: + + Sub(x) + Raw(x-bpp) + + (computed mod 256), where Raw refers to the bytes already decoded. + + 6.4. Filter type 2: Up + + The Up filter is just like the Sub filter except that the pixel + immediately above the current pixel, rather than just to its left, + is used as the predictor. + + To compute the Up filter, apply the following formula to each byte + of the scanline: + + Up(x) = Raw(x) - Prior(x) + + + +Boutell, et. al. Informational [Page 33] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + where x ranges from zero to the number of bytes representing the + scanline minus one, Raw(x) refers to the raw data byte at that + byte position in the scanline, and Prior(x) refers to the + unfiltered bytes of the prior scanline. + + Note this is done for each byte, regardless of bit depth. + Unsigned arithmetic modulo 256 is used, so that both the inputs + and outputs fit into bytes. The sequence of Up values is + transmitted as the filtered scanline. + + On the first scanline of an image (or of a pass of an interlaced + image), assume Prior(x) = 0 for all x. + + To reverse the effect of the Up filter after decompression, output + the following value: + + Up(x) + Prior(x) + + (computed mod 256), where Prior refers to the decoded bytes of the + prior scanline. + + 6.5. Filter type 3: Average + + The Average filter uses the average of the two neighboring pixels + (left and above) to predict the value of a pixel. + + To compute the Average filter, apply the following formula to each + byte of the scanline: + + Average(x) = Raw(x) - floor((Raw(x-bpp)+Prior(x))/2) + + where x ranges from zero to the number of bytes representing the + scanline minus one, Raw(x) refers to the raw data byte at that + byte position in the scanline, Prior(x) refers to the unfiltered + bytes of the prior scanline, and bpp is defined as for the Sub + filter. + + Note this is done for each byte, regardless of bit depth. The + sequence of Average values is transmitted as the filtered + scanline. + + The subtraction of the predicted value from the raw byte must be + done modulo 256, so that both the inputs and outputs fit into + bytes. However, the sum Raw(x-bpp)+Prior(x) must be formed + without overflow (using at least nine-bit arithmetic). floor() + indicates that the result of the division is rounded to the next + lower integer if fractional; in other words, it is an integer + division or right shift operation. + + + +Boutell, et. al. Informational [Page 34] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + For all x < 0, assume Raw(x) = 0. On the first scanline of an + image (or of a pass of an interlaced image), assume Prior(x) = 0 + for all x. + + To reverse the effect of the Average filter after decompression, + output the following value: + + Average(x) + floor((Raw(x-bpp)+Prior(x))/2) + + where the result is computed mod 256, but the prediction is + calculated in the same way as for encoding. Raw refers to the + bytes already decoded, and Prior refers to the decoded bytes of + the prior scanline. + + 6.6. Filter type 4: Paeth + + The Paeth filter computes a simple linear function of the three + neighboring pixels (left, above, upper left), then chooses as + predictor the neighboring pixel closest to the computed value. + This technique is due to Alan W. Paeth [PAETH]. + + To compute the Paeth filter, apply the following formula to each + byte of the scanline: + + Paeth(x) = Raw(x) - PaethPredictor(Raw(x-bpp), Prior(x), + Prior(x-bpp)) + + where x ranges from zero to the number of bytes representing the + scanline minus one, Raw(x) refers to the raw data byte at that + byte position in the scanline, Prior(x) refers to the unfiltered + bytes of the prior scanline, and bpp is defined as for the Sub + filter. + + Note this is done for each byte, regardless of bit depth. + Unsigned arithmetic modulo 256 is used, so that both the inputs + and outputs fit into bytes. The sequence of Paeth values is + transmitted as the filtered scanline. + + + + + + + + + + + + + + +Boutell, et. al. Informational [Page 35] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + The PaethPredictor function is defined by the following + pseudocode: + + function PaethPredictor (a, b, c) + begin + ; a = left, b = above, c = upper left + p := a + b - c ; initial estimate + pa := abs(p - a) ; distances to a, b, c + pb := abs(p - b) + pc := abs(p - c) + ; return nearest of a,b,c, + ; breaking ties in order a,b,c. + if pa <= pb AND pa <= pc then return a + else if pb <= pc then return b + else return c + end + + The calculations within the PaethPredictor function must be + performed exactly, without overflow. Arithmetic modulo 256 is to + be used only for the final step of subtracting the function result + from the target byte value. + + Note that the order in which ties are broken is critical and must + not be altered. The tie break order is: pixel to the left, pixel + above, pixel to the upper left. (This order differs from that + given in Paeth's article.) + + For all x < 0, assume Raw(x) = 0 and Prior(x) = 0. On the first + scanline of an image (or of a pass of an interlaced image), assume + Prior(x) = 0 for all x. + + To reverse the effect of the Paeth filter after decompression, + output the following value: + + Paeth(x) + PaethPredictor(Raw(x-bpp), Prior(x), Prior(x-bpp)) + + (computed mod 256), where Raw and Prior refer to bytes already + decoded. Exactly the same PaethPredictor function is used by both + encoder and decoder. + +7. Chunk Ordering Rules + + To allow new chunk types to be added to PNG, it is necessary to + establish rules about the ordering requirements for all chunk types. + Otherwise a PNG editing program cannot know what to do when it + encounters an unknown chunk. + + + + + +Boutell, et. al. Informational [Page 36] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + We define a "PNG editor" as a program that modifies a PNG file and + wishes to preserve as much as possible of the ancillary information + in the file. Two examples of PNG editors are a program that adds or + modifies text chunks, and a program that adds a suggested palette to + a truecolor PNG file. Ordinary image editors are not PNG editors in + this sense, because they usually discard all unrecognized information + while reading in an image. (Note: we strongly encourage programs + handling PNG files to preserve ancillary information whenever + possible.) + + As an example of possible problems, consider a hypothetical new + ancillary chunk type that is safe-to-copy and is required to appear + after PLTE if PLTE is present. If our program to add a suggested + PLTE does not recognize this new chunk, it may insert PLTE in the + wrong place, namely after the new chunk. We could prevent such + problems by requiring PNG editors to discard all unknown chunks, but + that is a very unattractive solution. Instead, PNG requires + ancillary chunks not to have ordering restrictions like this. + + To prevent this type of problem while allowing for future extension, + we put some constraints on both the behavior of PNG editors and the + allowed ordering requirements for chunks. + + 7.1. Behavior of PNG editors + + The rules for PNG editors are: + + * When copying an unknown unsafe-to-copy ancillary chunk, a + PNG editor must not move the chunk relative to any critical + chunk. It can relocate the chunk freely relative to other + ancillary chunks that occur between the same pair of + critical chunks. (This is well defined since the editor + must not add, delete, modify, or reorder critical chunks if + it is preserving unknown unsafe-to-copy chunks.) + * When copying an unknown safe-to-copy ancillary chunk, a PNG + editor must not move the chunk from before IDAT to after + IDAT or vice versa. (This is well defined because IDAT is + always present.) Any other reordering is permitted. + * When copying a known ancillary chunk type, an editor need + only honor the specific chunk ordering rules that exist for + that chunk type. However, it can always choose to apply the + above general rules instead. + * PNG editors must give up on encountering an unknown critical + chunk type, because there is no way to be certain that a + valid file will result from modifying a file containing such + a chunk. (Note that simply discarding the chunk is not good + enough, because it might have unknown implications for the + interpretation of other chunks.) + + + +Boutell, et. al. Informational [Page 37] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + These rules are expressed in terms of copying chunks from an input + file to an output file, but they apply in the obvious way if a PNG + file is modified in place. + + See also Chunk naming conventions (Section 3.3). + + 7.2. Ordering of ancillary chunks + + The ordering rules for an ancillary chunk type cannot be any + stricter than this: + + * Unsafe-to-copy chunks can have ordering requirements + relative to critical chunks. + * Safe-to-copy chunks can have ordering requirements relative + to IDAT. + + The actual ordering rules for any particular ancillary chunk type + may be weaker. See for example the ordering rules for the + standard ancillary chunk types (Summary of standard chunks, + Section 4.3). + + Decoders must not assume more about the positioning of any + ancillary chunk than is specified by the chunk ordering rules. In + particular, it is never valid to assume that a specific ancillary + chunk type occurs with any particular positioning relative to + other ancillary chunks. (For example, it is unsafe to assume that + your private ancillary chunk occurs immediately before IEND. Even + if your application always writes it there, a PNG editor might + have inserted some other ancillary chunk after it. But you can + safely assume that your chunk will remain somewhere between IDAT + and IEND.) + + 7.3. Ordering of critical chunks + + Critical chunks can have arbitrary ordering requirements, because + PNG editors are required to give up if they encounter unknown + critical chunks. For example, IHDR has the special ordering rule + that it must always appear first. A PNG editor, or indeed any + PNG-writing program, must know and follow the ordering rules for + any critical chunk type that it can emit. + + + + + + + + + + + +Boutell, et. al. Informational [Page 38] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + +8. Miscellaneous Topics + + 8.1. File name extension + + On systems where file names customarily include an extension + signifying file type, the extension ".png" is recommended for PNG + files. Lower case ".png" is preferred if file names are case- + sensitive. + + 8.2. Internet media type + + The Internet Assigned Numbers Authority (IANA) has registered + "image/png" as the Internet Media Type for PNG [RFC-2045, RFC- + 2048]. For robustness, decoders may choose to also support the + interim media type "image/x-png" which was in use before + registration was complete. + + 8.3. Macintosh file layout + + In the Apple Macintosh system, the following conventions are + recommended: + + * The four-byte file type code for PNG files is "PNGf". (This + code has been registered with Apple for PNG files.) The + creator code will vary depending on the creating + application. + * The contents of the data fork must be a PNG file exactly as + described in the rest of this specification. + * The contents of the resource fork are unspecified. It may + be empty or may contain application-dependent resources. + * When transferring a Macintosh PNG file to a non-Macintosh + system, only the data fork should be transferred. + + 8.4. Multiple-image extension + + PNG itself is strictly a single-image format. However, it may be + necessary to store multiple images within one file; for example, + this is needed to convert some GIF files. In the future, a + multiple-image format based on PNG may be defined. Such a format + will be considered a separate file format and will have a + different signature. PNG-supporting applications may or may not + choose to support the multiple-image format. + + See Rationale: Why not these features? (Section 12.3). + + + + + + + +Boutell, et. al. Informational [Page 39] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + 8.5. Security considerations + + A PNG file or datastream is composed of a collection of explicitly + typed "chunks". Chunks whose contents are defined by the + specification could actually contain anything, including malicious + code. But there is no known risk that such malicious code could + be executed on the recipient's computer as a result of decoding + the PNG image. + + The possible security risks associated with future chunk types + cannot be specified at this time. Security issues will be + considered when evaluating chunks proposed for registration as + public chunks. There is no additional security risk associated + with unknown or unimplemented chunk types, because such chunks + will be ignored, or at most be copied into another PNG file. + + The tEXt and zTXt chunks contain data that is meant to be + displayed as plain text. It is possible that if the decoder + displays such text without filtering out control characters, + especially the ESC (escape) character, certain systems or + terminals could behave in undesirable and insecure ways. We + recommend that decoders filter out control characters to avoid + this risk; see Recommendations for Decoders: Text chunk processing + (Section 10.11). + + Because every chunk's length is available at its beginning, and + because every chunk has a CRC trailer, there is a very robust + defense against corrupted data and against fraudulent chunks that + attempt to overflow the decoder's buffers. Also, the PNG + signature bytes provide early detection of common file + transmission errors. + + A decoder that fails to check CRCs could be subject to data + corruption. The only likely consequence of such corruption is + incorrectly displayed pixels within the image. Worse things might + happen if the CRC of the IHDR chunk is not checked and the width + or height fields are corrupted. See Recommendations for Decoders: + Error checking (Section 10.1). + + A poorly written decoder might be subject to buffer overflow, + because chunks can be extremely large, up to (2^31)-1 bytes long. + But properly written decoders will handle large chunks without + difficulty. + + + + + + + + +Boutell, et. al. Informational [Page 40] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + +9. Recommendations for Encoders + + This chapter gives some recommendations for encoder behavior. The + only absolute requirement on a PNG encoder is that it produce files + that conform to the format specified in the preceding chapters. + However, best results will usually be achieved by following these + recommendations. + + 9.1. Sample depth scaling + + When encoding input samples that have a sample depth that cannot + be directly represented in PNG, the encoder must scale the samples + up to a sample depth that is allowed by PNG. The most accurate + scaling method is the linear equation + + output = ROUND(input * MAXOUTSAMPLE / MAXINSAMPLE) + + where the input samples range from 0 to MAXINSAMPLE and the + outputs range from 0 to MAXOUTSAMPLE (which is (2^sampledepth)-1). + + A close approximation to the linear scaling method can be achieved + by "left bit replication", which is shifting the valid bits to + begin in the most significant bit and repeating the most + significant bits into the open bits. This method is often faster + to compute than linear scaling. As an example, assume that 5-bit + samples are being scaled up to 8 bits. If the source sample value + is 27 (in the range from 0-31), then the original bits are: + + 4 3 2 1 0 + --------- + 1 1 0 1 1 + + Left bit replication gives a value of 222: + + 7 6 5 4 3 2 1 0 + ---------------- + 1 1 0 1 1 1 1 0 + |=======| |===| + | Leftmost Bits Repeated to Fill Open Bits + | + Original Bits + + which matches the value computed by the linear equation. Left bit + replication usually gives the same value as linear scaling, and is + never off by more than one. + + + + + + +Boutell, et. al. Informational [Page 41] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + A distinctly less accurate approximation is obtained by simply + left-shifting the input value and filling the low order bits with + zeroes. This scheme cannot reproduce white exactly, since it does + not generate an all-ones maximum value; the net effect is to + darken the image slightly. This method is not recommended in + general, but it does have the effect of improving compression, + particularly when dealing with greater-than-eight-bit sample + depths. Since the relative error introduced by zero-fill scaling + is small at high sample depths, some encoders may choose to use + it. Zero-fill must not be used for alpha channel data, however, + since many decoders will special-case alpha values of all zeroes + and all ones. It is important to represent both those values + exactly in the scaled data. + + When the encoder writes an sBIT chunk, it is required to do the + scaling in such a way that the high-order bits of the stored + samples match the original data. That is, if the sBIT chunk + specifies a sample depth of S, the high-order S bits of the stored + data must agree with the original S-bit data values. This allows + decoders to recover the original data by shifting right. The + added low-order bits are not constrained. Note that all the above + scaling methods meet this restriction. + + When scaling up source data, it is recommended that the low-order + bits be filled consistently for all samples; that is, the same + source value should generate the same sample value at any pixel + position. This improves compression by reducing the number of + distinct sample values. However, this is not a requirement, and + some encoders may choose not to follow it. For example, an + encoder might instead dither the low-order bits, improving + displayed image quality at the price of increasing file size. + + In some applications the original source data may have a range + that is not a power of 2. The linear scaling equation still works + for this case, although the shifting methods do not. It is + recommended that an sBIT chunk not be written for such images, + since sBIT suggests that the original data range was exactly + 0..2^S-1. + + 9.2. Encoder gamma handling + + See Gamma Tutorial (Chapter 13) if you aren't already familiar + with gamma issues. + + Proper handling of gamma encoding and the gAMA chunk in an encoder + depends on the prior history of the sample values and on whether + these values have already been quantized to integers. + + + + +Boutell, et. al. Informational [Page 42] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + If the encoder has access to sample intensity values in floating- + point or high-precision integer form (perhaps from a computer + image renderer), then it is recommended that the encoder perform + its own gamma encoding before quantizing the data to integer + values for storage in the file. Applying gamma encoding at this + stage results in images with fewer banding artifacts at a given + sample depth, or allows smaller samples while retaining the same + visual quality. + + A linear intensity level, expressed as a floating-point value in + the range 0 to 1, can be converted to a gamma-encoded sample value + by + + sample = ROUND((intensity ^ encoder_gamma) * MAXSAMPLE) + + The file_gamma value to be written in the PNG gAMA chunk is the + same as encoder_gamma in this equation, since we are assuming the + initial intensity value is linear (in effect, camera_gamma is + 1.0). + + If the image is being written to a file only, the encoder_gamma + value can be selected somewhat arbitrarily. Values of 0.45 or 0.5 + are generally good choices because they are common in video + systems, and so most PNG decoders should do a good job displaying + such images. + + Some image renderers may simultaneously write the image to a PNG + file and display it on-screen. The displayed pixels should be + gamma corrected for the display system and viewing conditions in + use, so that the user sees a proper representation of the intended + scene. An appropriate gamma correction value is + + screen_gc = viewing_gamma / display_gamma + + If the renderer wants to write the same gamma-corrected sample + values to the PNG file, avoiding a separate gamma-encoding step + for file output, then this screen_gc value should be written in + the gAMA chunk. This will allow a PNG decoder to reproduce what + the file's originator saw on screen during rendering (provided the + decoder properly supports arbitrary values in a gAMA chunk). + + However, it is equally reasonable for a renderer to apply gamma + correction for screen display using a gamma appropriate to the + viewing conditions, and to separately gamma-encode the sample + values for file storage using a standard value of gamma such as + 0.5. In fact, this is preferable, since some PNG decoders may not + accurately display images with unusual gAMA values. + + + + +Boutell, et. al. Informational [Page 43] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Computer graphics renderers often do not perform gamma encoding, + instead making sample values directly proportional to scene light + intensity. If the PNG encoder receives sample values that have + already been quantized into linear-light integer values, there is + no point in doing gamma encoding on them; that would just result + in further loss of information. The encoder should just write the + sample values to the PNG file. This "linear" sample encoding is + equivalent to gamma encoding with a gamma of 1.0, so graphics + programs that produce linear samples should always emit a gAMA + chunk specifying a gamma of 1.0. + + When the sample values come directly from a piece of hardware, the + correct gAMA value is determined by the gamma characteristic of + the hardware. In the case of video digitizers ("frame grabbers"), + gAMA should be 0.45 or 0.5 for NTSC (possibly less for PAL or + SECAM) since video camera transfer functions are standardized. + Image scanners are less predictable. Their output samples may be + linear (gamma 1.0) since CCD sensors themselves are linear, or the + scanner hardware may have already applied gamma correction + designed to compensate for dot gain in subsequent printing (gamma + of about 0.57), or the scanner may have corrected the samples for + display on a CRT (gamma of 0.4-0.5). You will need to refer to + the scanner's manual, or even scan a calibrated gray wedge, to + determine what a particular scanner does. + + File format converters generally should not attempt to convert + supplied images to a different gamma. Store the data in the PNG + file without conversion, and record the source gamma if it is + known. Gamma alteration at file conversion time causes re- + quantization of the set of intensity levels that are represented, + introducing further roundoff error with little benefit. It's + almost always better to just copy the sample values intact from + the input to the output file. + + In some cases, the supplied image may be in an image format (e.g., + TIFF) that can describe the gamma characteristic of the image. In + such cases, a file format converter is strongly encouraged to + write a PNG gAMA chunk that corresponds to the known gamma of the + source image. Note that some file formats specify the gamma of + the display system, not the camera. If the input file's gamma + value is greater than 1.0, it is almost certainly a display system + gamma, and you should use its reciprocal for the PNG gAMA. + + + + + + + + + +Boutell, et. al. Informational [Page 44] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + If the encoder or file format converter does not know how an image + was originally created, but does know that the image has been + displayed satisfactorily on a display with gamma display_gamma + under lighting conditions where a particular viewing_gamma is + appropriate, then the image can be marked as having the + file_gamma: + + file_gamma = viewing_gamma / display_gamma + + This will allow viewers of the PNG file to see the same image that + the person running the file format converter saw. Although this + may not be precisely the correct value of the image gamma, it's + better to write a gAMA chunk with an approximately right value + than to omit the chunk and force PNG decoders to guess at an + appropriate gamma. + + On the other hand, if the image file is being converted as part of + a "bulk" conversion, with no one looking at each image, then it is + better to omit the gAMA chunk entirely. If the image gamma has to + be guessed at, leave it to the decoder to do the guessing. + + Gamma does not apply to alpha samples; alpha is always represented + linearly. + + See also Recommendations for Decoders: Decoder gamma handling + (Section 10.5). + + 9.3. Encoder color handling + + See Color Tutorial (Chapter 14) if you aren't already familiar + with color issues. + + If it is possible for the encoder to determine the chromaticities + of the source display primaries, or to make a strong guess based + on the origin of the image or the hardware running it, then the + encoder is strongly encouraged to output the cHRM chunk. If it + does so, the gAMA chunk should also be written; decoders can do + little with cHRM if gAMA is missing. + + + + + + + + + + + + + +Boutell, et. al. Informational [Page 45] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Video created with recent video equipment probably uses the CCIR + 709 primaries and D65 white point [ITU-BT709], which are: + + R G B White + x 0.640 0.300 0.150 0.3127 + y 0.330 0.600 0.060 0.3290 + + An older but still very popular video standard is SMPTE-C [SMPTE- + 170M]: + + R G B White + x 0.630 0.310 0.155 0.3127 + y 0.340 0.595 0.070 0.3290 + + The original NTSC color primaries have not been used in decades. + Although you may still find the NTSC numbers listed in standards + documents, you won't find any images that actually use them. + + Scanners that produce PNG files as output should insert the filter + chromaticities into a cHRM chunk and the camera_gamma into a gAMA + chunk. + + In the case of hand-drawn or digitally edited images, you have to + determine what monitor they were viewed on when being produced. + Many image editing programs allow you to specify what type of + monitor you are using. This is often because they are working in + some device-independent space internally. Such programs have + enough information to write valid cHRM and gAMA chunks, and should + do so automatically. + + If the encoder is compiled as a portion of a computer image + renderer that performs full-spectral rendering, the monitor values + that were used to convert from the internal device-independent + color space to RGB should be written into the cHRM chunk. Any + colors that are outside the gamut of the chosen RGB device should + be clipped or otherwise constrained to be within the gamut; PNG + does not store out of gamut colors. + + If the computer image renderer performs calculations directly in + device-dependent RGB space, a cHRM chunk should not be written + unless the scene description and rendering parameters have been + adjusted to look good on a particular monitor. In that case, the + data for that monitor (if known) should be used to construct a + cHRM chunk. + + + + + + + +Boutell, et. al. Informational [Page 46] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + There are often cases where an image's exact origins are unknown, + particularly if it began life in some other format. A few image + formats store calibration information, which can be used to fill + in the cHRM chunk. For example, all PhotoCD images use the CCIR + 709 primaries and D65 whitepoint, so these values can be written + into the cHRM chunk when converting a PhotoCD file. PhotoCD also + uses the SMPTE-170M transfer function, which is closely + approximated by a gAMA of 0.5. (PhotoCD can store colors outside + the RGB gamut, so the image data will require gamut mapping before + writing to PNG format.) TIFF 6.0 files can optionally store + calibration information, which if present should be used to + construct the cHRM chunk. GIF and most other formats do not store + any calibration information. + + It is not recommended that file format converters attempt to + convert supplied images to a different RGB color space. Store the + data in the PNG file without conversion, and record the source + primary chromaticities if they are known. Color space + transformation at file conversion time is a bad idea because of + gamut mismatches and rounding errors. As with gamma conversions, + it's better to store the data losslessly and incur at most one + conversion when the image is finally displayed. + + See also Recommendations for Decoders: Decoder color handling + (Section 10.6). + + 9.4. Alpha channel creation + + The alpha channel can be regarded either as a mask that + temporarily hides transparent parts of the image, or as a means + for constructing a non-rectangular image. In the first case, the + color values of fully transparent pixels should be preserved for + future use. In the second case, the transparent pixels carry no + useful data and are simply there to fill out the rectangular image + area required by PNG. In this case, fully transparent pixels + should all be assigned the same color value for best compression. + + Image authors should keep in mind the possibility that a decoder + will ignore transparency control. Hence, the colors assigned to + transparent pixels should be reasonable background colors whenever + feasible. + + For applications that do not require a full alpha channel, or + cannot afford the price in compression efficiency, the tRNS + transparency chunk is also available. + + + + + + +Boutell, et. al. Informational [Page 47] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + If the image has a known background color, this color should be + written in the bKGD chunk. Even decoders that ignore transparency + may use the bKGD color to fill unused screen area. + + If the original image has premultiplied (also called "associated") + alpha data, convert it to PNG's non-premultiplied format by + dividing each sample value by the corresponding alpha value, then + multiplying by the maximum value for the image bit depth, and + rounding to the nearest integer. In valid premultiplied data, the + sample values never exceed their corresponding alpha values, so + the result of the division should always be in the range 0 to 1. + If the alpha value is zero, output black (zeroes). + + 9.5. Suggested palettes + + A PLTE chunk can appear in truecolor PNG files. In such files, + the chunk is not an essential part of the image data, but simply + represents a suggested palette that viewers may use to present the + image on indexed-color display hardware. A suggested palette is + of no interest to viewers running on truecolor hardware. + + If an encoder chooses to provide a suggested palette, it is + recommended that a hIST chunk also be written to indicate the + relative importance of the palette entries. The histogram values + are most easily computed as "nearest neighbor" counts, that is, + the approximate usage of each palette entry if no dithering is + applied. (These counts will often be available for free as a + consequence of developing the suggested palette.) + + For images of color type 2 (truecolor without alpha channel), it + is recommended that the palette and histogram be computed with + reference to the RGB data only, ignoring any transparent-color + specification. If the file uses transparency (has a tRNS chunk), + viewers can easily adapt the resulting palette for use with their + intended background color. They need only replace the palette + entry closest to the tRNS color with their background color (which + may or may not match the file's bKGD color, if any). + + For images of color type 6 (truecolor with alpha channel), it is + recommended that a bKGD chunk appear and that the palette and + histogram be computed with reference to the image as it would + appear after compositing against the specified background color. + This definition is necessary to ensure that useful palette entries + are generated for pixels having fractional alpha values. The + resulting palette will probably only be useful to viewers that + present the image against the same background color. It is + recommended that PNG editors delete or recompute the palette if + they alter or remove the bKGD chunk in an image of color type 6. + + + +Boutell, et. al. Informational [Page 48] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + If PLTE appears without bKGD in an image of color type 6, the + circumstances under which the palette was computed are + unspecified. + + 9.6. Filter selection + + For images of color type 3 (indexed color), filter type 0 (None) + is usually the most effective. Note that color images with 256 or + fewer colors should almost always be stored in indexed color + format; truecolor format is likely to be much larger. + + Filter type 0 is also recommended for images of bit depths less + than 8. For low-bit-depth grayscale images, it may be a net win + to expand the image to 8-bit representation and apply filtering, + but this is rare. + + For truecolor and grayscale images, any of the five filters may + prove the most effective. If an encoder uses a fixed filter, the + Paeth filter is most likely to be the best. + + For best compression of truecolor and grayscale images, we + recommend an adaptive filtering approach in which a filter is + chosen for each scanline. The following simple heuristic has + performed well in early tests: compute the output scanline using + all five filters, and select the filter that gives the smallest + sum of absolute values of outputs. (Consider the output bytes as + signed differences for this test.) This method usually + outperforms any single fixed filter choice. However, it is likely + that much better heuristics will be found as more experience is + gained with PNG. + + Filtering according to these recommendations is effective on + interlaced as well as noninterlaced images. + + 9.7. Text chunk processing + + A nonempty keyword must be provided for each text chunk. The + generic keyword "Comment" can be used if no better description of + the text is available. If a user-supplied keyword is used, be + sure to check that it meets the restrictions on keywords. + + PNG text strings are expected to use the Latin-1 character set. + Encoders should avoid storing characters that are not defined in + Latin-1, and should provide character code remapping if the local + system's character set is not Latin-1. + + Encoders should discourage the creation of single lines of text + longer than 79 characters, in order to facilitate easy reading. + + + +Boutell, et. al. Informational [Page 49] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + It is recommended that text items less than 1K (1024 bytes) in + size should be output using uncompressed tEXt chunks. In + particular, it is recommended that the basic title and author + keywords should always be output using uncompressed tEXt chunks. + Lengthy disclaimers, on the other hand, are ideal candidates for + zTXt. + + Placing large tEXt and zTXt chunks after the image data (after + IDAT) can speed up image display in some situations, since the + decoder won't have to read over the text to get to the image data. + But it is recommended that small text chunks, such as the image + title, appear before IDAT. + + 9.8. Use of private chunks + + Applications can use PNG private chunks to carry information that + need not be understood by other applications. Such chunks must be + given names with lowercase second letters, to ensure that they can + never conflict with any future public chunk definition. Note, + however, that there is no guarantee that some other application + will not use the same private chunk name. If you use a private + chunk type, it is prudent to store additional identifying + information at the beginning of the chunk data. + + Use an ancillary chunk type (lowercase first letter), not a + critical chunk type, for all private chunks that store information + that is not absolutely essential to view the image. Creation of + private critical chunks is discouraged because they render PNG + files unportable. Such chunks should not be used in publicly + available software or files. If private critical chunks are + essential for your application, it is recommended that one appear + near the start of the file, so that a standard decoder need not + read very far before discovering that it cannot handle the file. + + If you want others outside your organization to understand a chunk + type that you invent, contact the maintainers of the PNG + specification to submit a proposed chunk name and definition for + addition to the list of special-purpose public chunks (see + Additional chunk types, Section 4.4). Note that a proposed public + chunk name (with uppercase second letter) must not be used in + publicly available software or files until registration has been + approved. + + If an ancillary chunk contains textual information that might be + of interest to a human user, you should not create a special chunk + type for it. Instead use a tEXt chunk and define a suitable + keyword. That way, the information will be available to users not + using your software. + + + +Boutell, et. al. Informational [Page 50] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Keywords in tEXt chunks should be reasonably self-explanatory, + since the idea is to let other users figure out what the chunk + contains. If of general usefulness, new keywords can be + registered with the maintainers of the PNG specification. But it + is permissible to use keywords without registering them first. + + 9.9. Private type and method codes + + This specification defines the meaning of only some of the + possible values of some fields. For example, only compression + method 0 and filter types 0 through 4 are defined. Numbers + greater than 127 must be used when inventing experimental or + private definitions of values for any of these fields. Numbers + below 128 are reserved for possible future public extensions of + this specification. Note that use of private type codes may + render a file unreadable by standard decoders. Such codes are + strongly discouraged except for experimental purposes, and should + not appear in publicly available software or files. + +10. Recommendations for Decoders + + This chapter gives some recommendations for decoder behavior. The + only absolute requirement on a PNG decoder is that it successfully + read any file conforming to the format specified in the preceding + chapters. However, best results will usually be achieved by + following these recommendations. + + 10.1. Error checking + + To ensure early detection of common file-transfer problems, + decoders should verify that all eight bytes of the PNG file + signature are correct. (See Rationale: PNG file signature, + Section 12.11.) A decoder can have additional confidence in the + file's integrity if the next eight bytes are an IHDR chunk header + with the correct chunk length. + + Unknown chunk types must be handled as described in Chunk naming + conventions (Section 3.3). An unknown chunk type is not to be + treated as an error unless it is a critical chunk. + + It is strongly recommended that decoders should verify the CRC on + each chunk. + + In some situations it is desirable to check chunk headers (length + and type code) before reading the chunk data and CRC. The chunk + type can be checked for plausibility by seeing whether all four + bytes are ASCII letters (codes 65-90 and 97-122); note that this + need only be done for unrecognized type codes. If the total file + + + +Boutell, et. al. Informational [Page 51] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + size is known (from file system information, HTTP protocol, etc), + the chunk length can be checked for plausibility as well. + + If CRCs are not checked, dropped/added data bytes or an erroneous + chunk length can cause the decoder to get out of step and + misinterpret subsequent data as a chunk header. Verifying that + the chunk type contains letters is an inexpensive way of providing + early error detection in this situation. + + For known-length chunks such as IHDR, decoders should treat an + unexpected chunk length as an error. Future extensions to this + specification will not add new fields to existing chunks; instead, + new chunk types will be added to carry new information. + + Unexpected values in fields of known chunks (for example, an + unexpected compression method in the IHDR chunk) must be checked + for and treated as errors. However, it is recommended that + unexpected field values be treated as fatal errors only in + critical chunks. An unexpected value in an ancillary chunk can be + handled by ignoring the whole chunk as though it were an unknown + chunk type. (This recommendation assumes that the chunk's CRC has + been verified. In decoders that do not check CRCs, it is safer to + treat any unexpected value as indicating a corrupted file.) + + 10.2. Pixel dimensions + + Non-square pixels can be represented (see the pHYs chunk), but + viewers are not required to account for them; a viewer can present + any PNG file as though its pixels are square. + + Conversely, viewers running on display hardware with non-square + pixels are strongly encouraged to rescale images for proper + display. + + 10.3. Truecolor image handling + + To achieve PNG's goal of universal interchangeability, decoders + are required to accept all types of PNG image: indexed-color, + truecolor, and grayscale. Viewers running on indexed-color + display hardware need to be able to reduce truecolor images to + indexed format for viewing. This process is usually called "color + quantization". + + + + + + + + + +Boutell, et. al. Informational [Page 52] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + A simple, fast way of doing this is to reduce the image to a fixed + palette. Palettes with uniform color spacing ("color cubes") are + usually used to minimize the per-pixel computation. For + photograph-like images, dithering is recommended to avoid ugly + contours in what should be smooth gradients; however, dithering + introduces graininess that can be objectionable. + + The quality of rendering can be improved substantially by using a + palette chosen specifically for the image, since a color cube + usually has numerous entries that are unused in any particular + image. This approach requires more work, first in choosing the + palette, and second in mapping individual pixels to the closest + available color. PNG allows the encoder to supply a suggested + palette in a PLTE chunk, but not all encoders will do so, and the + suggested palette may be unsuitable in any case (it may have too + many or too few colors). High-quality viewers will therefore need + to have a palette selection routine at hand. A large lookup table + is usually the most feasible way of mapping individual pixels to + palette entries with adequate speed. + + Numerous implementations of color quantization are available. The + PNG reference implementation, libpng, includes code for the + purpose. + + 10.4. Sample depth rescaling + + Decoders may wish to scale PNG data to a lesser sample depth (data + precision) for display. For example, 16-bit data will need to be + reduced to 8-bit depth for use on most present-day display + hardware. Reduction of 8-bit data to 5-bit depth is also common. + + The most accurate scaling is achieved by the linear equation + + output = ROUND(input * MAXOUTSAMPLE / MAXINSAMPLE) + + where + + MAXINSAMPLE = (2^sampledepth)-1 + MAXOUTSAMPLE = (2^desired_sampledepth)-1 + + A slightly less accurate conversion is achieved by simply shifting + right by sampledepth-desired_sampledepth places. For example, to + reduce 16-bit samples to 8-bit, one need only discard the low- + order byte. In many situations the shift method is sufficiently + accurate for display purposes, and it is certainly much faster. + (But if gamma correction is being done, sample rescaling can be + merged into the gamma correction lookup table, as is illustrated + in Decoder gamma handling, Section 10.5.) + + + +Boutell, et. al. Informational [Page 53] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + When an sBIT chunk is present, the original pre-PNG data can be + recovered by shifting right to the sample depth specified by sBIT. + Note that linear scaling will not necessarily reproduce the + original data, because the encoder is not required to have used + linear scaling to scale the data up. However, the encoder is + required to have used a method that preserves the high-order bits, + so shifting always works. This is the only case in which shifting + might be said to be more accurate than linear scaling. + + When comparing pixel values to tRNS chunk values to detect + transparent pixels, it is necessary to do the comparison exactly. + Therefore, transparent pixel detection must be done before + reducing sample precision. + + 10.5. Decoder gamma handling + + See Gamma Tutorial (Chapter 13) if you aren't already familiar + with gamma issues. + + To produce correct tone reproduction, a good image display program + should take into account the gammas of the image file and the + display device, as well as the viewing_gamma appropriate to the + lighting conditions near the display. This can be done by + calculating + + gbright = insample / MAXINSAMPLE + bright = gbright ^ (1.0 / file_gamma) + vbright = bright ^ viewing_gamma + gcvideo = vbright ^ (1.0 / display_gamma) + fbval = ROUND(gcvideo * MAXFBVAL) + + where MAXINSAMPLE is the maximum sample value in the file (255 for + 8-bit, 65535 for 16-bit, etc), MAXFBVAL is the maximum value of a + frame buffer sample (255 for 8-bit, 31 for 5-bit, etc), insample + is the value of the sample in the PNG file, and fbval is the value + to write into the frame buffer. The first line converts from + integer samples into a normalized 0 to 1 floating point value, the + second undoes the gamma encoding of the image file to produce a + linear intensity value, the third adjusts for the viewing + conditions, the fourth corrects for the display system's gamma + value, and the fifth converts to an integer frame buffer sample. + In practice, the second through fourth lines can be merged into + + gcvideo = gbright^(viewing_gamma / (file_gamma*display_gamma)) + + so as to perform only one power calculation. For color images, the + entire calculation is performed separately for R, G, and B values. + + + + +Boutell, et. al. Informational [Page 54] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + It is not necessary to perform transcendental math for every + pixel. Instead, compute a lookup table that gives the correct + output value for every possible sample value. This requires only + 256 calculations per image (for 8-bit accuracy), not one or three + calculations per pixel. For an indexed-color image, a one-time + correction of the palette is sufficient, unless the image uses + transparency and is being displayed against a nonuniform + background. + + In some cases even the cost of computing a gamma lookup table may + be a concern. In these cases, viewers are encouraged to have + precomputed gamma correction tables for file_gamma values of 1.0 + and 0.5 with some reasonable choice of viewing_gamma and + display_gamma, and to use the table closest to the gamma indicated + in the file. This will produce acceptable results for the majority + of real files. + + When the incoming image has unknown gamma (no gAMA chunk), choose + a likely default file_gamma value, but allow the user to select a + new one if the result proves too dark or too light. + + In practice, it is often difficult to determine what value of + display_gamma should be used. In systems with no built-in gamma + correction, the display_gamma is determined entirely by the CRT. + Assuming a CRT_gamma of 2.5 is recommended, unless you have + detailed calibration measurements of this particular CRT + available. + + However, many modern frame buffers have lookup tables that are + used to perform gamma correction, and on these systems the + display_gamma value should be the gamma of the lookup table and + CRT combined. You may not be able to find out what the lookup + table contains from within an image viewer application, so you may + have to ask the user what the system's gamma value is. + Unfortunately, different manufacturers use different ways of + specifying what should go into the lookup table, so interpretation + of the system gamma value is system-dependent. Gamma Tutorial + (Chapter 13) gives some examples. + + The response of real displays is actually more complex than can be + described by a single number (display_gamma). If actual + measurements of the monitor's light output as a function of + voltage input are available, the fourth and fifth lines of the + computation above can be replaced by a lookup in these + measurements, to find the actual frame buffer value that most + nearly gives the desired brightness. + + + + + +Boutell, et. al. Informational [Page 55] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + The value of viewing_gamma depends on lighting conditions; see + Gamma Tutorial (Chapter 13) for more detail. Ideally, a viewer + would allow the user to specify viewing_gamma, either directly + numerically, or via selecting from "bright surround", "dim + surround", and "dark surround" conditions. Viewers that don't + want to do this should just assume a value for viewing_gamma of + 1.0, since most computer displays live in brightly-lit rooms. + + When viewing images that are digitized from video, or that are + destined to become video frames, the user might want to set the + viewing_gamma to about 1.25 regardless of the actual level of room + lighting. This value of viewing_gamma is "built into" NTSC video + practice, and displaying an image with that viewing_gamma allows + the user to see what a TV set would show under the current room + lighting conditions. (This is not the same thing as trying to + obtain the most accurate rendition of the content of the scene, + which would require adjusting viewing_gamma to correspond to the + room lighting level.) This is another reason viewers might want + to allow users to adjust viewing_gamma directly. + + 10.6. Decoder color handling + + See Color Tutorial (Chapter 14) if you aren't already familiar + with color issues. + + In many cases, decoders will treat image data in PNG files as + device-dependent RGB data and display it without modification + (except for appropriate gamma correction). This provides the + fastest display of PNG images. But unless the viewer uses exactly + the same display hardware as the original image author used, the + colors will not be exactly the same as the original author saw, + particularly for darker or near-neutral colors. The cHRM chunk + provides information that allows closer color matching than that + provided by gamma correction alone. + + Decoders can use the cHRM data to transform the image data from + RGB to XYZ and thence into a perceptually linear color space such + as CIE LAB. They can then partition the colors to generate an + optimal palette, because the geometric distance between two colors + in CIE LAB is strongly related to how different those colors + appear (unlike, for example, RGB or XYZ spaces). The resulting + palette of colors, once transformed back into RGB color space, + could be used for display or written into a PLTE chunk. + + Decoders that are part of image processing applications might also + transform image data into CIE LAB space for analysis. + + + + + +Boutell, et. al. Informational [Page 56] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + In applications where color fidelity is critical, such as product + design, scientific visualization, medicine, architecture, or + advertising, decoders can transform the image data from source_RGB + to the display_RGB space of the monitor used to view the image. + This involves calculating the matrix to go from source_RGB to XYZ + and the matrix to go from XYZ to display_RGB, then combining them + to produce the overall transformation. The decoder is responsible + for implementing gamut mapping. + + Decoders running on platforms that have a Color Management System + (CMS) can pass the image data, gAMA and cHRM values to the CMS for + display or further processing. + + Decoders that provide color printing facilities can use the + facilities in Level 2 PostScript to specify image data in + calibrated RGB space or in a device-independent color space such + as XYZ. This will provide better color fidelity than a simple RGB + to CMYK conversion. The PostScript Language Reference manual + gives examples of this process [POSTSCRIPT]. Such decoders are + responsible for implementing gamut mapping between source_RGB + (specified in the cHRM chunk) and the target printer. The + PostScript interpreter is then responsible for producing the + required colors. + + Decoders can use the cHRM data to calculate an accurate grayscale + representation of a color image. Conversion from RGB to gray is + simply a case of calculating the Y (luminance) component of XYZ, + which is a weighted sum of the R G and B values. The weights + depend on the monitor type, i.e., the values in the cHRM chunk. + Decoders may wish to do this for PNG files with no cHRM chunk. In + that case, a reasonable default would be the CCIR 709 primaries + [ITU-BT709]. Do not use the original NTSC primaries, unless you + really do have an image color-balanced for such a monitor. Few + monitors ever used the NTSC primaries, so such images are probably + nonexistent these days. + + 10.7. Background color + + The background color given by bKGD will typically be used to fill + unused screen space around the image, as well as any transparent + pixels within the image. (Thus, bKGD is valid and useful even + when the image does not use transparency.) If no bKGD chunk is + present, the viewer will need to make its own decision about a + suitable background color. + + + + + + + +Boutell, et. al. Informational [Page 57] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Viewers that have a specific background against which to present + the image (such as Web browsers) should ignore the bKGD chunk, in + effect overriding bKGD with their preferred background color or + background image. + + The background color given by bKGD is not to be considered + transparent, even if it happens to match the color given by tRNS + (or, in the case of an indexed-color image, refers to a palette + index that is marked as transparent by tRNS). Otherwise one would + have to imagine something "behind the background" to composite + against. The background color is either used as background or + ignored; it is not an intermediate layer between the PNG image and + some other background. + + Indeed, it will be common that bKGD and tRNS specify the same + color, since then a decoder that does not implement transparency + processing will give the intended display, at least when no + partially-transparent pixels are present. + + 10.8. Alpha channel processing + + In the most general case, the alpha channel can be used to + composite a foreground image against a background image; the PNG + file defines the foreground image and the transparency mask, but + not the background image. Decoders are not required to support + this most general case. It is expected that most will be able to + support compositing against a single background color, however. + + The equation for computing a composited sample value is + + output = alpha * foreground + (1-alpha) * background + + where alpha and the input and output sample values are expressed + as fractions in the range 0 to 1. This computation should be + performed with linear (non-gamma-encoded) sample values. For + color images, the computation is done separately for R, G, and B + samples. + + The following code illustrates the general case of compositing a + foreground image over a background image. It assumes that you + have the original pixel data available for the background image, + and that output is to a frame buffer for display. Other variants + are possible; see the comments below the code. The code allows + the sample depths and gamma values of foreground image, background + image, and frame buffer/CRT all to be different. Don't assume + they are the same without checking. + + + + + +Boutell, et. al. Informational [Page 58] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + This code is standard C, with line numbers added for reference in + the comments below. + + 01 int foreground[4]; /* image pixel: R, G, B, A */ + 02 int background[3]; /* background pixel: R, G, B */ + 03 int fbpix[3]; /* frame buffer pixel */ + 04 int fg_maxsample; /* foreground max sample */ + 05 int bg_maxsample; /* background max sample */ + 06 int fb_maxsample; /* frame buffer max sample */ + 07 int ialpha; + 08 float alpha, compalpha; + 09 float gamfg, linfg, gambg, linbg, comppix, gcvideo; + + /* Get max sample values in data and frame buffer */ + 10 fg_maxsample = (1 << fg_sample_depth) - 1; + 11 bg_maxsample = (1 << bg_sample_depth) - 1; + 12 fb_maxsample = (1 << frame_buffer_sample_depth) - 1; + /* + * Get integer version of alpha. + * Check for opaque and transparent special cases; + * no compositing needed if so. + * + * We show the whole gamma decode/correct process in + * floating point, but it would more likely be done + * with lookup tables. + */ + 13 ialpha = foreground[3]; + + 14 if (ialpha == 0) { + /* + * Foreground image is transparent here. + * If the background image is already in the frame + * buffer, there is nothing to do. + */ + 15 ; + 16 } else if (ialpha == fg_maxsample) { + /* + * Copy foreground pixel to frame buffer. + */ + 17 for (i = 0; i < 3; i++) { + 18 gamfg = (float) foreground[i] / fg_maxsample; + 19 linfg = pow(gamfg, 1.0/fg_gamma); + 20 comppix = linfg; + 21 gcvideo = pow(comppix,viewing_gamma/display_gamma); + 22 fbpix[i] = (int) (gcvideo * fb_maxsample + 0.5); + 23 } + + + + + +Boutell, et. al. Informational [Page 59] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + 24 } else { + /* + * Compositing is necessary. + * Get floating-point alpha and its complement. + * Note: alpha is always linear; gamma does not + * affect it. + */ + 25 alpha = (float) ialpha / fg_maxsample; + 26 compalpha = 1.0 - alpha; + 27 for (i = 0; i < 3; i++) { + /* + * Convert foreground and background to floating + * point, then linearize (undo gamma encoding). + */ + 28 gamfg = (float) foreground[i] / fg_maxsample; + 29 linfg = pow(gamfg, 1.0/fg_gamma); + 30 gambg = (float) background[i] / bg_maxsample; + 31 linbg = pow(gambg, 1.0/bg_gamma); + /* + * Composite. + */ + 32 comppix = linfg * alpha + linbg * compalpha; + /* + * Gamma correct for display. + * Convert to integer frame buffer pixel. + */ + 33 gcvideo = pow(comppix,viewing_gamma/display_gamma); + 34 fbpix[i] = (int) (gcvideo * fb_maxsample + 0.5); + 35 } + 36 } + + Variations: + + * If output is to another PNG image file instead of a frame + buffer, lines 21, 22, 33, and 34 should be changed to be + something like + + /* + * Gamma encode for storage in output file. + * Convert to integer sample value. + */ + gamout = pow(comppix, outfile_gamma); + outpix[i] = (int) (gamout * out_maxsample + 0.5); + + Also, it becomes necessary to process background pixels when + alpha is zero, rather than just skipping pixels. Thus, line + 15 will need to be replaced by copies of lines 17-23, but + processing background instead of foreground pixel values. + + + +Boutell, et. al. Informational [Page 60] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + * If the sample depths of the output file, foreground file, + and background file are all the same, and the three gamma + values also match, then the no-compositing code in lines + 14-23 reduces to nothing more than copying pixel values from + the input file to the output file if alpha is one, or + copying pixel values from background to output file if alpha + is zero. Since alpha is typically either zero or one for + the vast majority of pixels in an image, this is a great + savings. No gamma computations are needed for most pixels. + * When the sample depths and gamma values all match, it may + appear attractive to skip the gamma decoding and encoding + (lines 28-31, 33-34) and just perform line 32 using gamma- + encoded sample values. Although this doesn't hurt image + quality too badly, the time savings are small if alpha + values of zero and one are special-cased as recommended + here. + * If the original pixel values of the background image are no + longer available, only processed frame buffer pixels left by + display of the background image, then lines 30 and 31 need + to extract intensity from the frame buffer pixel values + using code like + + /* + * Decode frame buffer value back into linear space. + */ + gcvideo = (float) fbpix[i] / fb_maxsample; + linbg = pow(gcvideo, display_gamma / viewing_gamma); + + However, some roundoff error can result, so it is better to + have the original background pixels available if at all + possible. + * Note that lines 18-22 are performing exactly the same gamma + computation that is done when no alpha channel is present. + So, if you handle the no-alpha case with a lookup table, you + can use the same lookup table here. Lines 28-31 and 33-34 + can also be done with (different) lookup tables. + * Of course, everything here can be done in integer + arithmetic. Just be careful to maintain sufficient + precision all the way through. + + Note: in floating point, no overflow or underflow checks are + needed, because the input sample values are guaranteed to be + between 0 and 1, and compositing always yields a result that is in + between the input values (inclusive). With integer arithmetic, + some roundoff-error analysis might be needed to guarantee no + overflow or underflow. + + + + + +Boutell, et. al. Informational [Page 61] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + When displaying a PNG image with full alpha channel, it is + important to be able to composite the image against some + background, even if it's only black. Ignoring the alpha channel + will cause PNG images that have been converted from an + associated-alpha representation to look wrong. (Of course, if the + alpha channel is a separate transparency mask, then ignoring alpha + is a useful option: it allows the hidden parts of the image to be + recovered.) + + Even if the decoder author does not wish to implement true + compositing logic, it is simple to deal with images that contain + only zero and one alpha values. (This is implicitly true for + grayscale and truecolor PNG files that use a tRNS chunk; for + indexed-color PNG files, it is easy to check whether tRNS contains + any values other than 0 and 255.) In this simple case, + transparent pixels are replaced by the background color, while + others are unchanged. If a decoder contains only this much + transparency capability, it should deal with a full alpha channel + by treating all nonzero alpha values as fully opaque; that is, do + not replace partially transparent pixels by the background. This + approach will not yield very good results for images converted + from associated-alpha formats, but it's better than doing nothing. + + 10.9. Progressive display + + When receiving images over slow transmission links, decoders can + improve perceived performance by displaying interlaced images + progressively. This means that as each pass is received, an + approximation to the complete image is displayed based on the data + received so far. One simple yet pleasing effect can be obtained + by expanding each received pixel to fill a rectangle covering the + yet-to-be-transmitted pixel positions below and to the right of + the received pixel. This process can be described by the + following pseudocode: + + Starting_Row [1..7] = { 0, 0, 4, 0, 2, 0, 1 } + Starting_Col [1..7] = { 0, 4, 0, 2, 0, 1, 0 } + Row_Increment [1..7] = { 8, 8, 8, 4, 4, 2, 2 } + Col_Increment [1..7] = { 8, 8, 4, 4, 2, 2, 1 } + Block_Height [1..7] = { 8, 8, 4, 4, 2, 2, 1 } + Block_Width [1..7] = { 8, 4, 4, 2, 2, 1, 1 } + + pass := 1 + while pass <= 7 + begin + row := Starting_Row[pass] + + while row < height + + + +Boutell, et. al. Informational [Page 62] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + begin + col := Starting_Col[pass] + + while col < width + begin + visit (row, col, + min (Block_Height[pass], height - row), + min (Block_Width[pass], width - col)) + col := col + Col_Increment[pass] + end + row := row + Row_Increment[pass] + end + + pass := pass + 1 + end + + Here, the function "visit(row,column,height,width)" obtains the + next transmitted pixel and paints a rectangle of the specified + height and width, whose upper-left corner is at the specified row + and column, using the color indicated by the pixel. Note that row + and column are measured from 0,0 at the upper left corner. + + If the decoder is merging the received image with a background + image, it may be more convenient just to paint the received pixel + positions; that is, the "visit()" function sets only the pixel at + the specified row and column, not the whole rectangle. This + produces a "fade-in" effect as the new image gradually replaces + the old. An advantage of this approach is that proper alpha or + transparency processing can be done as each pixel is replaced. + Painting a rectangle as described above will overwrite + background-image pixels that may be needed later, if the pixels + eventually received for those positions turn out to be wholly or + partially transparent. Of course, this is only a problem if the + background image is not stored anywhere offscreen. + + 10.10. Suggested-palette and histogram usage + + In truecolor PNG files, the encoder may have provided a suggested + PLTE chunk for use by viewers running on indexed-color hardware. + + If the image has a tRNS chunk, the viewer will need to adapt the + suggested palette for use with its desired background color. To + do this, replace the palette entry closest to the tRNS color with + the desired background color; or just add a palette entry for the + background color, if the viewer can handle more colors than there + are PLTE entries. + + + + + +Boutell, et. al. Informational [Page 63] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + For images of color type 6 (truecolor with alpha channel), any + suggested palette should have been designed for display of the + image against a uniform background of the color specified by bKGD. + Viewers should probably ignore the palette if they intend to use a + different background, or if the bKGD chunk is missing. Viewers + can use a suggested palette for display against a different + background than it was intended for, but the results may not be + very good. + + If the viewer presents a transparent truecolor image against a + background that is more complex than a single color, it is + unlikely that the suggested palette will be optimal for the + composite image. In this case it is best to perform a truecolor + compositing step on the truecolor PNG image and background image, + then color-quantize the resulting image. + + The histogram chunk is useful when the viewer cannot provide as + many colors as are used in the image's palette. If the viewer is + only short a few colors, it is usually adequate to drop the + least-used colors from the palette. To reduce the number of + colors substantially, it's best to choose entirely new + representative colors, rather than trying to use a subset of the + existing palette. This amounts to performing a new color + quantization step; however, the existing palette and histogram can + be used as the input data, thus avoiding a scan of the image data. + + If no palette or histogram chunk is provided, a decoder can + develop its own, at the cost of an extra pass over the image data. + Alternatively, a default palette (probably a color cube) can be + used. + + See also Recommendations for Encoders: Suggested palettes (Section + 9.5). + + 10.11. Text chunk processing + + If practical, decoders should have a way to display to the user + all tEXt and zTXt chunks found in the file. Even if the decoder + does not recognize a particular text keyword, the user might be + able to understand it. + + PNG text is not supposed to contain any characters outside the ISO + 8859-1 "Latin-1" character set (that is, no codes 0-31 or 127- + 159), except for the newline character (decimal 10). But decoders + might encounter such characters anyway. Some of these characters + can be safely displayed (e.g., TAB, FF, and CR, decimal 9, 12, and + 13, respectively), but others, especially the ESC character + (decimal 27), could pose a security hazard because unexpected + + + +Boutell, et. al. Informational [Page 64] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + actions may be taken by display hardware or software. To prevent + such hazards, decoders should not attempt to directly display any + non-Latin-1 characters (except for newline and perhaps TAB, FF, + CR) encountered in a tEXt or zTXt chunk. Instead, ignore them or + display them in a visible notation such as "\nnn". See Security + considerations (Section 8.5). + + Even though encoders are supposed to represent newlines as LF, it + is recommended that decoders not rely on this; it's best to + recognize all the common newline combinations (CR, LF, and CR-LF) + and display each as a single newline. TAB can be expanded to the + proper number of spaces needed to arrive at a column multiple of + 8. + + Decoders running on systems with non-Latin-1 character set + encoding should provide character code remapping so that Latin-1 + characters are displayed correctly. Some systems may not provide + all the characters defined in Latin-1. Mapping unavailable + characters to a visible notation such as "\nnn" is a good + fallback. In particular, character codes 127-255 should be + displayed only if they are printable characters on the decoding + system. Some systems may interpret such codes as control + characters; for security, decoders running on such systems should + not display such characters literally. + + Decoders should be prepared to display text chunks that contain + any number of printing characters between newline characters, even + though encoders are encouraged to avoid creating lines in excess + of 79 characters. + +11. Glossary + + a^b + Exponentiation; a raised to the power b. C programmers should be + careful not to misread this notation as exclusive-or. Note that + in gamma-related calculations, zero raised to any power is valid + and must give a zero result. + + Alpha + A value representing a pixel's degree of transparency. The more + transparent a pixel, the less it hides the background against + which the image is presented. In PNG, alpha is really the degree + of opacity: zero alpha represents a completely transparent pixel, + maximum alpha represents a completely opaque pixel. But most + people refer to alpha as providing transparency information, not + opacity information, and we continue that custom here. + + + + + +Boutell, et. al. Informational [Page 65] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Ancillary chunk + A chunk that provides additional information. A decoder can still + produce a meaningful image, though not necessarily the best + possible image, without processing the chunk. + + Bit depth + The number of bits per palette index (in indexed-color PNGs) or + per sample (in other color types). This is the same value that + appears in IHDR. + + Byte + Eight bits; also called an octet. + + Channel + The set of all samples of the same kind within an image; for + example, all the blue samples in a truecolor image. (The term + "component" is also used, but not in this specification.) A + sample is the intersection of a channel and a pixel. + + Chromaticity + A pair of values x,y that precisely specify the hue, though not + the absolute brightness, of a perceived color. + + Chunk + A section of a PNG file. Each chunk has a type indicated by its + chunk type name. Most types of chunks also include some data. + The format and meaning of the data within the chunk are determined + by the type name. + + Composite + As a verb, to form an image by merging a foreground image and a + background image, using transparency information to determine + where the background should be visible. The foreground image is + said to be "composited against" the background. + + CRC + Cyclic Redundancy Check. A CRC is a type of check value designed + to catch most transmission errors. A decoder calculates the CRC + for the received data and compares it to the CRC that the encoder + calculated, which is appended to the data. A mismatch indicates + that the data was corrupted in transit. + + Critical chunk + A chunk that must be understood and processed by the decoder in + order to produce a meaningful image from a PNG file. + + CRT + Cathode Ray Tube: a common type of computer display hardware. + + + +Boutell, et. al. Informational [Page 66] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Datastream + A sequence of bytes. This term is used rather than "file" to + describe a byte sequence that is only a portion of a file. We + also use it to emphasize that a PNG image might be generated and + consumed "on the fly", never appearing in a stored file at all. + + Deflate + The name of the compression algorithm used in standard PNG files, + as well as in zip, gzip, pkzip, and other compression programs. + Deflate is a member of the LZ77 family of compression methods. + + Filter + A transformation applied to image data in hopes of improving its + compressibility. PNG uses only lossless (reversible) filter + algorithms. + + Frame buffer + The final digital storage area for the image shown by a computer + display. Software causes an image to appear onscreen by loading + it into the frame buffer. + + Gamma + The brightness of mid-level tones in an image. More precisely, a + parameter that describes the shape of the transfer function for + one or more stages in an imaging pipeline. The transfer function + is given by the expression + + output = input ^ gamma + + where both input and output are scaled to the range 0 to 1. + + Grayscale + An image representation in which each pixel is represented by a + single sample value representing overall luminance (on a scale + from black to white). PNG also permits an alpha sample to be + stored for each pixel of a grayscale image. + + Indexed color + An image representation in which each pixel is represented by a + single sample that is an index into a palette or lookup table. + The selected palette entry defines the actual color of the pixel. + + Lossless compression + Any method of data compression that guarantees the original data + can be reconstructed exactly, bit-for-bit. + + + + + + +Boutell, et. al. Informational [Page 67] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Lossy compression + Any method of data compression that reconstructs the original data + approximately, rather than exactly. + + LSB + Least Significant Byte of a multi-byte value. + + Luminance + Perceived brightness, or grayscale level, of a color. Luminance + and chromaticity together fully define a perceived color. + + LUT + Look Up Table. In general, a table used to transform data. In + frame buffer hardware, a LUT can be used to map indexed-color + pixels into a selected set of truecolor values, or to perform + gamma correction. In software, a LUT can be used as a fast way of + implementing any one-variable mathematical function. + + MSB + Most Significant Byte of a multi-byte value. + + Palette + The set of colors available in an indexed-color image. In PNG, a + palette is an array of colors defined by red, green, and blue + samples. (Alpha values can also be defined for palette entries, + via the tRNS chunk.) + + Pixel + The information stored for a single grid point in the image. The + complete image is a rectangular array of pixels. + + PNG editor + A program that modifies a PNG file and preserves ancillary + information, including chunks that it does not recognize. Such a + program must obey the rules given in Chunk Ordering Rules (Chapter + 7). + + Sample + A single number in the image data; for example, the red value of a + pixel. A pixel is composed of one or more samples. When + discussing physical data layout (in particular, in Image layout, + Section 2.3), we use "sample" to mean a number stored in the image + array. It would be more precise but much less readable to say + "sample or palette index" in that context. Elsewhere in the + specification, "sample" means a color value or alpha value. In + the indexed-color case, these are palette entries not palette + indexes. + + + + +Boutell, et. al. Informational [Page 68] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Sample depth + The precision, in bits, of color values and alpha values. In + indexed-color PNGs the sample depth is always 8 by definition of + the PLTE chunk. In other color types it is the same as the bit + depth. + + Scanline + One horizontal row of pixels within an image. + + Truecolor + An image representation in which pixel colors are defined by + storing three samples for each pixel, representing red, green, and + blue intensities respectively. PNG also permits an alpha sample + to be stored for each pixel of a truecolor image. + + White point + The chromaticity of a computer display's nominal white value. + + zlib + A particular format for data that has been compressed using + deflate-style compression. Also the name of a library + implementing this method. PNG implementations need not use the + zlib library, but they must conform to its format for compressed + data. + +12. Appendix: Rationale + + (This appendix is not part of the formal PNG specification.) + + This appendix gives the reasoning behind some of the design decisions + in PNG. Many of these decisions were the subject of considerable + debate. The authors freely admit that another group might have made + different decisions; however, we believe that our choices are + defensible and consistent. + + 12.1. Why a new file format? + + Does the world really need yet another graphics format? We + believe so. GIF is no longer freely usable, but no other commonly + used format can directly replace it, as is discussed in more + detail below. We might have used an adaptation of an existing + format, for example GIF with an unpatented compression scheme. + But this would require new code anyway; it would not be all that + much easier to implement than a whole new file format. (PNG is + designed to be simple to implement, with the exception of the + compression engine, which would be needed in any case.) We feel + that this is an excellent opportunity to design a new format that + fixes some of the known limitations of GIF. + + + +Boutell, et. al. Informational [Page 69] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + 12.2. Why these features? + + The features chosen for PNG are intended to address the needs of + applications that previously used the special strengths of GIF. + In particular, GIF is well adapted for online communications + because of its streamability and progressive display capability. + PNG shares those attributes. + + We have also addressed some of the widely known shortcomings of + GIF. In particular, PNG supports truecolor images. We know of no + widely used image format that losslessly compresses truecolor + images as effectively as PNG does. We hope that PNG will make use + of truecolor images more practical and widespread. + + Some form of transparency control is desirable for applications in + which images are displayed against a background or together with + other images. GIF provided a simple transparent-color + specification for this purpose. PNG supports a full alpha channel + as well as transparent-color specifications. This allows both + highly flexible transparency and compression efficiency. + + Robustness against transmission errors has been an important + consideration. For example, images transferred across Internet + are often mistakenly processed as text, leading to file + corruption. PNG is designed so that such errors can be detected + quickly and reliably. + + PNG has been expressly designed not to be completely dependent on + a single compression technique. Although deflate/inflate + compression is mentioned in this document, PNG would still exist + without it. + + 12.3. Why not these features? + + Some features have been deliberately omitted from PNG. These + choices were made to simplify implementation of PNG, promote + portability and interchangeability, and make the format as simple + and foolproof as possible for users. In particular: + + + + + + + + + + + + + +Boutell, et. al. Informational [Page 70] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + * There is no uncompressed variant of PNG. It is possible to + store uncompressed data by using only uncompressed deflate + blocks (a feature normally used to guarantee that deflate + does not make incompressible data much larger). However, + PNG software must support full deflate/inflate; any software + that does not is not compliant with the PNG standard. The + two most important features of PNG---portability and + compression---are absolute requirements for online + applications, and users demand them. Failure to support full + deflate/inflate compromises both of these objectives. + * There is no lossy compression in PNG. Existing formats such + as JFIF already handle lossy compression well. Furthermore, + available lossy compression methods (e.g., JPEG) are far + from foolproof --- a poor choice of quality level can ruin + an image. To avoid user confusion and unintentional loss of + information, we feel it is best to keep lossy and lossless + formats strictly separate. Also, lossy compression is + complex to implement. Adding JPEG support to a PNG decoder + might increase its size by an order of magnitude. This + would certainly cause some decoders to omit support for the + feature, which would destroy our goal of interchangeability. + * There is no support for CMYK or other unusual color spaces. + Again, this is in the name of promoting portability. CMYK, + in particular, is far too device-dependent to be useful as a + portable image representation. + * There is no standard chunk for thumbnail views of images. + In discussions with software vendors who use thumbnails in + their products, it has become clear that most would not use + a "standard" thumbnail chunk. For one thing, every vendor + has a different idea of what the dimensions and + characteristics of a thumbnail ought to be. Also, some + vendors keep thumbnails in separate files to accommodate + varied image formats; they are not going to stop doing that + simply because of a thumbnail chunk in one new format. + Proprietary chunks containing vendor-specific thumbnails + appear to be more practical than a common thumbnail format. + + It is worth noting that private extensions to PNG could easily add + these features. We will not, however, include them as part of the + basic PNG standard. + + + + + + + + + + + +Boutell, et. al. Informational [Page 71] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + PNG also does not support multiple images in one file. This + restriction is a reflection of the reality that many applications + do not need and will not support multiple images per file. In any + case, single images are a fundamentally different sort of object + from sequences of images. Rather than make false promises of + interchangeability, we have drawn a clear distinction between + single-image and multi-image formats. PNG is a single-image + format. (But see Multiple-image extension, Section 8.4.) + + 12.4. Why not use format X? + + Numerous existing formats were considered before deciding to + develop PNG. None could meet the requirements we felt were + important for PNG. + + GIF is no longer suitable as a universal standard because of legal + entanglements. Although just replacing GIF's compression method + would avoid that problem, GIF does not support truecolor images, + alpha channels, or gamma correction. The spec has more subtle + problems too. Only a small subset of the GIF89 spec is actually + portable across a variety of implementations, but there is no + codification of the most portable part of the spec. + + TIFF is far too complex to meet our goals of simplicity and + interchangeability. Defining a TIFF subset would meet that + objection, but would frustrate users making the reasonable + assumption that a file saved as TIFF from their existing software + would load into a program supporting our flavor of TIFF. + Furthermore, TIFF is not designed for stream processing, has no + provision for progressive display, and does not currently provide + any good, legally unencumbered, lossless compression method. + + IFF has also been suggested, but is not suitable in detail: + available image representations are too machine-specific or not + adequately compressed. The overall chunk structure of IFF is a + useful concept that PNG has liberally borrowed from, but we did + not attempt to be bit-for-bit compatible with IFF chunk structure. + Again this is due to detailed issues, notably the fact that IFF + FORMs are not designed to be serially writable. + + Lossless JPEG is not suitable because it does not provide for the + storage of indexed-color images. Furthermore, its lossless + truecolor compression is often inferior to that of PNG. + + + + + + + + +Boutell, et. al. Informational [Page 72] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + 12.5. Byte order + + It has been asked why PNG uses network byte order. We have + selected one byte ordering and used it consistently. Which order + in particular is of little relevance, but network byte order has + the advantage that routines to convert to and from it are already + available on any platform that supports TCP/IP networking, + including all PC platforms. The functions are trivial and will be + included in the reference implementation. + + 12.6. Interlacing + + PNG's two-dimensional interlacing scheme is more complex to + implement than GIF's line-wise interlacing. It also costs a + little more in file size. However, it yields an initial image + eight times faster than GIF (the first pass transmits only 1/64th + of the pixels, compared to 1/8th for GIF). Although this initial + image is coarse, it is useful in many situations. For example, if + the image is a World Wide Web imagemap that the user has seen + before, PNG's first pass is often enough to determine where to + click. The PNG scheme also looks better than GIF's, because + horizontal and vertical resolution never differ by more than a + factor of two; this avoids the odd "stretched" look seen when + interlaced GIFs are filled in by replicating scanlines. + Preliminary results show that small text in an interlaced PNG + image is typically readable about twice as fast as in an + equivalent GIF, i.e., after PNG's fifth pass or 25% of the image + data, instead of after GIF's third pass or 50%. This is again due + to PNG's more balanced increase in resolution. + + 12.7. Why gamma? + + It might seem natural to standardize on storing sample values that + are linearly proportional to light intensity (that is, have gamma + of 1.0). But in fact, it is common for images to have a gamma of + less than 1. There are three good reasons for this: + + * For reasons detailed in Gamma Tutorial (Chapter 13), all + video cameras apply a "gamma correction" function to the + intensity information. This causes the video signal to have + a gamma of about 0.5 relative to the light intensity in the + original scene. Thus, images obtained by frame-grabbing + video already have a gamma of about 0.5. + * The human eye has a nonlinear response to intensity, so + linear encoding of samples either wastes sample codes in + bright areas of the image, or provides too few sample codes + to avoid banding artifacts in dark areas of the image, or + both. At least 12 bits per sample are needed to avoid + + + +Boutell, et. al. Informational [Page 73] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + visible artifacts in linear encoding with a 100:1 image + intensity range. An image gamma in the range 0.3 to 0.5 + allocates sample values in a way that roughly corresponds to + the eye's response, so that 8 bits/sample are enough to + avoid artifacts caused by insufficient sample precision in + almost all images. This makes "gamma encoding" a much + better way of storing digital images than the simpler linear + encoding. + * Many images are created on PCs or workstations with no gamma + correction hardware and no software willing to provide gamma + correction either. In these cases, the images have had + their lighting and color chosen to look best on this + platform --- they can be thought of as having "manual" gamma + correction built in. To see what the image author intended, + it is necessary to treat such images as having a file_gamma + value in the range 0.4-0.6, depending on the room lighting + level that the author was working in. + + In practice, image gamma values around 1.0 and around 0.5 are both + widely found. Older image standards such as GIF often do not + account for this fact. The JFIF standard specifies that images in + that format should use linear samples, but many JFIF images found + on the Internet actually have a gamma somewhere near 0.4 or 0.5. + The variety of images found and the variety of systems that people + display them on have led to widespread problems with images + appearing "too dark" or "too light". + + PNG expects viewers to compensate for image gamma at the time that + the image is displayed. Another possible approach is to expect + encoders to convert all images to a uniform gamma at encoding + time. While that method would speed viewers slightly, it has + fundamental flaws: + + * Gamma correction is inherently lossy due to quantization and + roundoff error. Requiring conversion at encoding time thus + causes irreversible loss. Since PNG is intended to be a + lossless storage format, this is undesirable; we should + store unmodified source data. + * The encoder might not know the source gamma value. If the + decoder does gamma correction at viewing time, it can adjust + the gamma (change the displayed brightness) in response to + feedback from a human user. The encoder has no such + recourse. + * Whatever "standard" gamma we settled on would be wrong for + some displays. Hence viewers would still need gamma + correction capability. + + + + + +Boutell, et. al. Informational [Page 74] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Since there will always be images with no gamma or an incorrect + recorded gamma, good viewers will need to incorporate gamma + adjustment code anyway. Gamma correction at viewing time is thus + the right way to go. + + See Gamma Tutorial (Chapter 13) for more information. + + 12.8. Non-premultiplied alpha + + PNG uses "unassociated" or "non-premultiplied" alpha so that + images with separate transparency masks can be stored losslessly. + Another common technique, "premultiplied alpha", stores pixel + values premultiplied by the alpha fraction; in effect, the image + is already composited against a black background. Any image data + hidden by the transparency mask is irretrievably lost by that + method, since multiplying by a zero alpha value always produces + zero. + + Some image rendering techniques generate images with premultiplied + alpha (the alpha value actually represents how much of the pixel + is covered by the image). This representation can be converted to + PNG by dividing the sample values by alpha, except where alpha is + zero. The result will look good if displayed by a viewer that + handles alpha properly, but will not look very good if the viewer + ignores the alpha channel. + + Although each form of alpha storage has its advantages, we did not + want to require all PNG viewers to handle both forms. We + standardized on non-premultiplied alpha as being the lossless and + more general case. + + 12.9. Filtering + + PNG includes filtering capability because filtering can + significantly reduce the compressed size of truecolor and + grayscale images. Filtering is also sometimes of value on + indexed-color images, although this is less common. + + The filter algorithms are defined to operate on bytes, rather than + pixels; this gains simplicity and speed with very little cost in + compression performance. Tests have shown that filtering is + usually ineffective for images with fewer than 8 bits per sample, + so providing pixelwise filtering for such images would be + pointless. For 16 bit/sample data, bytewise filtering is nearly + as effective as pixelwise filtering, because MSBs are predicted + from adjacent MSBs, and LSBs are predicted from adjacent LSBs. + + + + + +Boutell, et. al. Informational [Page 75] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + The encoder is allowed to change filters for each new scanline. + This creates no additional complexity for decoders, since a + decoder is required to contain defiltering logic for every filter + type anyway. The only cost is an extra byte per scanline in the + pre-compression datastream. Our tests showed that when the same + filter is selected for all scanlines, this extra byte compresses + away to almost nothing, so there is little storage cost compared + to a fixed filter specified for the whole image. And the + potential benefits of adaptive filtering are too great to ignore. + Even with the simplistic filter-choice heuristics so far + discovered, adaptive filtering usually outperforms fixed filters. + In particular, an adaptive filter can change behavior for + successive passes of an interlaced image; a fixed filter cannot. + + 12.10. Text strings + + Most graphics file formats include the ability to store some + textual information along with the image. But many applications + need more than that: they want to be able to store several + identifiable pieces of text. For example, a database using PNG + files to store medical X-rays would likely want to include + patient's name, doctor's name, etc. A simple way to do this in + PNG would be to invent new private chunks holding text. The + disadvantage of such an approach is that other applications would + have no idea what was in those chunks, and would simply ignore + them. Instead, we recommend that textual information be stored in + standard tEXt chunks with suitable keywords. Use of tEXt tells + any PNG viewer that the chunk contains text that might be of + interest to a human user. Thus, a person looking at the file with + another viewer will still be able to see the text, and even + understand what it is if the keywords are reasonably self- + explanatory. (To this end, we recommend spelled-out keywords, not + abbreviations that will be hard for a person to understand. + Saving a few bytes on a keyword is false economy.) + + The ISO 8859-1 (Latin-1) character set was chosen as a compromise + between functionality and portability. Some platforms cannot + display anything more than 7-bit ASCII characters, while others + can handle characters beyond the Latin-1 set. We felt that + Latin-1 represents a widely useful and reasonably portable + character set. Latin-1 is a direct subset of character sets + commonly used on popular platforms such as Microsoft Windows and X + Windows. It can also be handled on Macintosh systems with a + simple remapping of characters. + + There is presently no provision for text employing character sets + other than Latin-1. We recognize that the need for other character + sets will increase. However, PNG already requires that + + + +Boutell, et. al. Informational [Page 76] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + programmers implement a number of new and unfamiliar features, and + text representation is not PNG's primary purpose. Since PNG + provides for the creation and public registration of new ancillary + chunks of general interest, we expect that text chunks for other + character sets, such as Unicode, eventually will be registered and + increase gradually in popularity. + + 12.11. PNG file signature + + The first eight bytes of a PNG file always contain the following + values: + + (decimal) 137 80 78 71 13 10 26 10 + (hexadecimal) 89 50 4e 47 0d 0a 1a 0a + (ASCII C notation) \211 P N G \r \n \032 \n + + This signature both identifies the file as a PNG file and provides + for immediate detection of common file-transfer problems. The + first two bytes distinguish PNG files on systems that expect the + first two bytes to identify the file type uniquely. The first + byte is chosen as a non-ASCII value to reduce the probability that + a text file may be misrecognized as a PNG file; also, it catches + bad file transfers that clear bit 7. Bytes two through four name + the format. The CR-LF sequence catches bad file transfers that + alter newline sequences. The control-Z character stops file + display under MS-DOS. The final line feed checks for the inverse + of the CR-LF translation problem. + + A decoder may further verify that the next eight bytes contain an + IHDR chunk header with the correct chunk length; this will catch + bad transfers that drop or alter null (zero) bytes. + + Note that there is no version number in the signature, nor indeed + anywhere in the file. This is intentional: the chunk mechanism + provides a better, more flexible way to handle format extensions, + as explained in Chunk naming conventions (Section 12.13). + + 12.12. Chunk layout + + The chunk design allows decoders to skip unrecognized or + uninteresting chunks: it is simply necessary to skip the + appropriate number of bytes, as determined from the length field. + + Limiting chunk length to (2^31)-1 bytes avoids possible problems + for implementations that cannot conveniently handle 4-byte + unsigned values. In practice, chunks will usually be much shorter + than that anyway. + + + + +Boutell, et. al. Informational [Page 77] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + A separate CRC is provided for each chunk in order to detect + badly-transferred images as quickly as possible. In particular, + critical data such as the image dimensions can be validated before + being used. + + The chunk length is excluded from the CRC so that the CRC can be + calculated as the data is generated; this avoids a second pass + over the data in cases where the chunk length is not known in + advance. Excluding the length from the CRC does not create any + extra risk of failing to discover file corruption, since if the + length is wrong, the CRC check will fail: the CRC will be computed + on the wrong set of bytes and then be tested against the wrong + value from the file. + + 12.13. Chunk naming conventions + + The chunk naming conventions allow safe, flexible extension of the + PNG format. This mechanism is much better than a format version + number, because it works on a feature-by-feature basis rather than + being an overall indicator. Decoders can process newer files if + and only if the files use no unknown critical features (as + indicated by finding unknown critical chunks). Unknown ancillary + chunks can be safely ignored. We decided against having an + overall format version number because experience has shown that + format version numbers hurt portability as much as they help. + Version numbers tend to be set unnecessarily high, leading to + older decoders rejecting files that they could have processed + (this was a serious problem for several years after the GIF89 spec + came out, for example). Furthermore, private extensions can be + made either critical or ancillary, and standard decoders should + react appropriately; overall version numbers are no help for + private extensions. + + A hypothetical chunk for vector graphics would be a critical + chunk, since if ignored, important parts of the intended image + would be missing. A chunk carrying the Mandelbrot set coordinates + for a fractal image would be ancillary, since other applications + could display the image without understanding what the image + represents. In general, a chunk type should be made critical only + if it is impossible to display a reasonable representation of the + intended image without interpreting that chunk. + + + + + + + + + + +Boutell, et. al. Informational [Page 78] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + The public/private property bit ensures that any newly defined + public chunk type name cannot conflict with proprietary chunks + that could be in use somewhere. However, this does not protect + users of private chunk names from the possibility that someone + else may use the same chunk name for a different purpose. It is a + good idea to put additional identifying information at the start + of the data for any private chunk type. + + When a PNG file is modified, certain ancillary chunks may need to + be changed to reflect changes in other chunks. For example, a + histogram chunk needs to be changed if the image data changes. If + the file editor does not recognize histogram chunks, copying them + blindly to a new output file is incorrect; such chunks should be + dropped. The safe/unsafe property bit allows ancillary chunks to + be marked appropriately. + + Not all possible modification scenarios are covered by the + safe/unsafe semantics. In particular, chunks that are dependent + on the total file contents are not supported. (An example of such + a chunk is an index of IDAT chunk locations within the file: + adding a comment chunk would inadvertently break the index.) + Definition of such chunks is discouraged. If absolutely necessary + for a particular application, such chunks can be made critical + chunks, with consequent loss of portability to other applications. + In general, ancillary chunks can depend on critical chunks but not + on other ancillary chunks. It is expected that mutually dependent + information should be put into a single chunk. + + In some situations it may be unavoidable to make one ancillary + chunk dependent on another. Although the chunk property bits are + insufficient to represent this case, a simple solution is + available: in the dependent chunk, record the CRC of the chunk + depended on. It can then be determined whether that chunk has + been changed by some other program. + + The same technique can be useful for other purposes. For example, + if a program relies on the palette being in a particular order, it + can store a private chunk containing the CRC of the PLTE chunk. + If this value matches when the file is again read in, then it + provides high confidence that the palette has not been tampered + with. Note that it is not necessary to mark the private chunk + unsafe-to-copy when this technique is used; thus, such a private + chunk can survive other editing of the file. + + + + + + + + +Boutell, et. al. Informational [Page 79] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + 12.14. Palette histograms + + A viewer may not be able to provide as many colors as are listed + in the image's palette. (For example, some colors could be + reserved by a window system.) To produce the best results in this + situation, it is helpful to have information about the frequency + with which each palette index actually appears, in order to choose + the best palette for dithering or to drop the least-used colors. + Since images are often created once and viewed many times, it + makes sense to calculate this information in the encoder, although + it is not mandatory for the encoder to provide it. + + Other image formats have usually addressed this problem by + specifying that the palette entries should appear in order of + frequency of use. That is an inferior solution, because it + doesn't give the viewer nearly as much information: the viewer + can't determine how much damage will be done by dropping the last + few colors. Nor does a sorted palette give enough information to + choose a target palette for dithering, in the case that the viewer + needs to reduce the number of colors substantially. A palette + histogram provides the information needed to choose such a target + palette without making a pass over the image data. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Boutell, et. al. Informational [Page 80] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + +13. Appendix: Gamma Tutorial + + (This appendix is not part of the formal PNG specification.) + + It would be convenient for graphics programmers if all of the + components of an imaging system were linear. The voltage coming from + an electronic camera would be directly proportional to the intensity + (power) of light in the scene, the light emitted by a CRT would be + directly proportional to its input voltage, and so on. However, + real-world devices do not behave in this way. All CRT displays, + almost all photographic film, and many electronic cameras have + nonlinear signal-to-light-intensity or intensity-to-signal + characteristics. + + Fortunately, all of these nonlinear devices have a transfer function + that is approximated fairly well by a single type of mathematical + function: a power function. This power function has the general + equation + + output = input ^ gamma + + where ^ denotes exponentiation, and "gamma" (often printed using the + Greek letter gamma, thus the name) is simply the exponent of the + power function. + + By convention, "input" and "output" are both scaled to the range + 0..1, with 0 representing black and 1 representing maximum white (or + red, etc). Normalized in this way, the power function is completely + described by a single number, the exponent "gamma". + + So, given a particular device, we can measure its output as a + function of its input, fit a power function to this measured transfer + function, extract the exponent, and call it gamma. We often say + "this device has a gamma of 2.5" as a shorthand for "this device has + a power-law response with an exponent of 2.5". We can also talk + about the gamma of a mathematical transform, or of a lookup table in + a frame buffer, so long as the input and output of the thing are + related by the power-law expression above. + + How do gammas combine? + + Real imaging systems will have several components, and more than + one of these can be nonlinear. If all of the components have + transfer characteristics that are power functions, then the + transfer function of the entire system is also a power function. + The exponent (gamma) of the whole system's transfer function is + just the product of all of the individual exponents (gammas) of + the separate stages in the system. + + + +Boutell, et. al. Informational [Page 81] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Also, stages that are linear pose no problem, since a power + function with an exponent of 1.0 is really a linear function. So + a linear transfer function is just a special case of a power + function, with a gamma of 1.0. + + Thus, as long as our imaging system contains only stages with + linear and power-law transfer functions, we can meaningfully talk + about the gamma of the entire system. This is indeed the case + with most real imaging systems. + + What should overall gamma be? + + If the overall gamma of an imaging system is 1.0, its output is + linearly proportional to its input. This means that the ratio + between the intensities of any two areas in the reproduced image + will be the same as it was in the original scene. It might seem + that this should always be the goal of an imaging system: to + accurately reproduce the tones of the original scene. Alas, that + is not the case. + + When the reproduced image is to be viewed in "bright surround" + conditions, where other white objects nearby in the room have + about the same brightness as white in the image, then an overall + gamma of 1.0 does indeed give real-looking reproduction of a + natural scene. Photographic prints viewed under room light and + computer displays in bright room light are typical "bright + surround" viewing conditions. + + However, sometimes images are intended to be viewed in "dark + surround" conditions, where the room is substantially black except + for the image. This is typical of the way movies and slides + (transparencies) are viewed by projection. Under these + circumstances, an accurate reproduction of the original scene + results in an image that human viewers judge as "flat" and lacking + in contrast. It turns out that the projected image needs to have + a gamma of about 1.5 relative to the original scene for viewers to + judge it "natural". Thus, slide film is designed to have a gamma + of about 1.5, not 1.0. + + There is also an intermediate condition called "dim surround", + where the rest of the room is still visible to the viewer, but is + noticeably darker than the reproduced image itself. This is + typical of television viewing, at least in the evening, as well as + subdued-light computer work areas. In dim surround conditions, + the reproduced image needs to have a gamma of about 1.25 relative + to the original scene in order to look natural. + + + + + +Boutell, et. al. Informational [Page 82] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + The requirement for boosted contrast (gamma) in dark surround + conditions is due to the way the human visual system works, and + applies equally well to computer monitors. Thus, a PNG viewer + trying to achieve the maximum realism for the images it displays + really needs to know what the room lighting conditions are, and + adjust the gamma of the displayed image accordingly. + + If asking the user about room lighting conditions is inappropriate + or too difficult, just assume that the overall gamma + (viewing_gamma as defined below) should be 1.0 or 1.25. That's + all that most systems that implement gamma correction do. + + What is a CRT's gamma? + + All CRT displays have a power-law transfer characteristic with a + gamma of about 2.5. This is due to the physical processes + involved in controlling the electron beam in the electron gun, and + has nothing to do with the phosphor. + + An exception to this rule is fancy "calibrated" CRTs that have + internal electronics to alter their transfer function. If you + have one of these, you probably should believe what the + manufacturer tells you its gamma is. But in all other cases, + assuming 2.5 is likely to be pretty accurate. + + There are various images around that purport to measure gamma, + usually by comparing the intensity of an area containing + alternating white and black with a series of areas of continuous + gray of different intensity. These are usually not reliable. + Test images that use a "checkerboard" pattern of black and white + are the worst, because a single white pixel will be reproduced + considerably darker than a large area of white. An image that + uses alternating black and white horizontal lines (such as the + "gamma.png" test image at + ftp://ftp.uu.net/graphics/png/images/suite/gamma.png) is much + better, but even it may be inaccurate at high "picture" settings + on some CRTs. + + If you have a good photometer, you can measure the actual light + output of a CRT as a function of input voltage and fit a power + function to the measurements. However, note that this procedure + is very sensitive to the CRT's black level adjustment, somewhat + sensitive to its picture adjustment, and also affected by ambient + light. Furthermore, CRTs spread some light from bright areas of + an image into nearby darker areas; a single bright spot against a + black background may be seen to have a "halo". Your measuring + technique will need to minimize the effects of this. + + + + +Boutell, et. al. Informational [Page 83] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Because of the difficulty of measuring gamma, using either test + images or measuring equipment, you're usually better off just + assuming gamma is 2.5 rather than trying to measure it. + + What is gamma correction? + + A CRT has a gamma of 2.5, and we can't change that. To get an + overall gamma of 1.0 (or somewhere near that) for an imaging + system, we need to have at least one other component of the "image + pipeline" that is nonlinear. If, in fact, there is only one + nonlinear stage in addition to the CRT, then it's traditional to + say that the CRT has a certain gamma, and that the other nonlinear + stage provides "gamma correction" to compensate for the CRT. + However, exactly where the "correction" is done depends on + circumstance. + + In all broadcast video systems, gamma correction is done in the + camera. This choice was made in the days when television + electronics were all analog, and a good gamma-correction circuit + was expensive to build. The original NTSC video standard required + cameras to have a transfer function with a gamma of 1/2.2, or + about 0.45. Recently, a more complex two-part transfer function + has been adopted [SMPTE-170M], but its behavior can be well + approximated by a power function with a gamma of 0.5. When the + resulting image is displayed on a CRT with a gamma of 2.5, the + image on screen ends up with a gamma of about 1.25 relative to the + original scene, which is appropriate for "dim surround" viewing. + + These days, video signals are often digitized and stored in + computer frame buffers. This works fine, but remember that gamma + correction is "built into" the video signal, and so the digitized + video has a gamma of about 0.5 relative to the original scene. + + Computer rendering programs often produce linear samples. To + display these correctly, intensity on the CRT needs to be directly + proportional to the sample values in the frame buffer. This can + be done with a special hardware lookup table between the frame + buffer and the CRT hardware. The lookup table (often called LUT) + is loaded with a mapping that implements a power function with a + gamma of 0.4, thus providing "gamma correction" for the CRT gamma. + + Thus, gamma correction sometimes happens before the frame buffer, + sometimes after. As long as images created in a particular + environment are always displayed in that environment, everything + is fine. But when people try to exchange images, differences in + gamma correction conventions often result in images that seem far + too bright and washed out, or far too dark and contrasty. + + + + +Boutell, et. al. Informational [Page 84] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Gamma-encoded samples are good + + So, is it better to do gamma correction before or after the frame + buffer? + + In an ideal world, sample values would be stored in floating + point, there would be lots of precision, and it wouldn't really + matter much. But in reality, we're always trying to store images + in as few bits as we can. + + If we decide to use samples that are linearly proportional to + intensity, and do the gamma correction in the frame buffer LUT, it + turns out that we need to use at least 12 bits for each of red, + green, and blue to have enough precision in intensity. With any + less than that, we will sometimes see "contour bands" or "Mach + bands" in the darker areas of the image, where two adjacent sample + values are still far enough apart in intensity for the difference + to be visible. + + However, through an interesting coincidence, the human eye's + subjective perception of brightness is related to the physical + stimulation of light intensity in a manner that is very much like + the power function used for gamma correction. If we apply gamma + correction to measured (or calculated) light intensity before + quantizing to an integer for storage in a frame buffer, we can get + away with using many fewer bits to store the image. In fact, 8 + bits per color is almost always sufficient to avoid contouring + artifacts. This is because, since gamma correction is so closely + related to human perception, we are assigning our 256 available + sample codes to intensity values in a manner that approximates how + visible those intensity changes are to the eye. Compared to a + linear-sample image, we allocate fewer sample values to brighter + parts of the tonal range and more sample values to the darker + portions of the tonal range. + + Thus, for the same apparent image quality, images using gamma- + encoded sample values need only about two-thirds as many bits of + storage as images using linear samples. + + + + + + + + + + + + + +Boutell, et. al. Informational [Page 85] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + General gamma handling + + When more than two nonlinear transfer functions are involved in + the image pipeline, the term "gamma correction" becomes too vague. + If we consider a pipeline that involves capturing (or calculating) + an image, storing it in an image file, reading the file, and + displaying the image on some sort of display screen, there are at + least 5 places in the pipeline that could have nonlinear transfer + functions. Let's give each a specific name for their + characteristic gamma: + + camera_gamma + the characteristic of the image sensor + + encoding_gamma + the gamma of any transformation performed by the software + writing the image file + + decoding_gamma + the gamma of any transformation performed by the software + reading the image file + + LUT_gamma + the gamma of the frame buffer LUT, if present + + CRT_gamma + the gamma of the CRT, generally 2.5 + + In addition, let's add a few other names: + + file_gamma + the gamma of the image in the file, relative to the original + scene. This is + + file_gamma = camera_gamma * encoding_gamma + + display_gamma + the gamma of the "display system" downstream of the frame + buffer. This is + + display_gamma = LUT_gamma * CRT_gamma + + viewing_gamma + the overall gamma that we want to obtain to produce pleasing + images --- generally 1.0 to 1.5. + + + + + + +Boutell, et. al. Informational [Page 86] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + The file_gamma value, as defined above, is what goes in the gAMA + chunk in a PNG file. If file_gamma is not 1.0, we know that gamma + correction has been done on the sample values in the file, and we + could call them "gamma corrected" samples. However, since there + can be so many different values of gamma in the image display + chain, and some of them are not known at the time the image is + written, the samples are not really being "corrected" for a + specific display condition. We are really using a power function + in the process of encoding an intensity range into a small integer + field, and so it is more correct to say "gamma encoded" samples + instead of "gamma corrected" samples. + + When displaying an image file, the image decoding program is + responsible for making the overall gamma of the system equal to + the desired viewing_gamma, by selecting the decoding_gamma + appropriately. When displaying a PNG file, the gAMA chunk + provides the file_gamma value. The display_gamma may be known for + this machine, or it might be obtained from the system software, or + the user might have to be asked what it is. The correct + viewing_gamma depends on lighting conditions, and that will + generally have to come from the user. + + Ultimately, you should have + + file_gamma * decoding_gamma * display_gamma = viewing_gamma + + Some specific examples + + In digital video systems, camera_gamma is about 0.5 by declaration + of the various video standards documents. CRT_gamma is 2.5 as + usual, while encoding_gamma, decoding_gamma, and LUT_gamma are all + 1.0. As a result, viewing_gamma ends up being about 1.25. + + On frame buffers that have hardware gamma correction tables, and + that are calibrated to display linear samples correctly, + display_gamma is 1.0. + + Many workstations and X terminals and PC displays lack gamma + correction lookup tables. Here, LUT_gamma is always 1.0, so + display_gamma is 2.5. + + + + + + + + + + + +Boutell, et. al. Informational [Page 87] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + On the Macintosh, there is a LUT. By default, it is loaded with a + table whose gamma is about 0.72, giving a display_gamma (LUT and + CRT combined) of about 1.8. Some Macs have a "Gamma" control + panel that allows gamma to be changed to 1.0, 1.2, 1.4, 1.8, or + 2.2. These settings load alternate LUTs that are designed to give + a display_gamma that is equal to the label on the selected button. + Thus, the "Gamma" control panel setting can be used directly as + display_gamma in decoder calculations. + + On recent SGI systems, there is a hardware gamma-correction table + whose contents are controlled by the (privileged) "gamma" program. + The gamma of the table is actually the reciprocal of the number + that "gamma" prints, and it does not include the CRT gamma. To + obtain the display_gamma, you need to find the SGI system gamma + (either by looking in a file, or asking the user) and then + calculating + + display_gamma = 2.5 / SGI_system_gamma + + You will find SGI systems with the system gamma set to 1.0 and 2.2 + (or higher), but the default when machines are shipped is 1.7. + + A note about video gamma + + The original NTSC video standards specified a simple power-law + camera transfer function with a gamma of 1/2.2 or 0.45. This is + not possible to implement exactly in analog hardware because the + function has infinite slope at x=0, so all cameras deviated to + some degree from this ideal. More recently, a new camera transfer + function that is physically realizable has been accepted as a + standard [SMPTE-170M]. It is + + Vout = 4.5 * Vin if Vin < 0.018 + Vout = 1.099 * (Vin^0.45) - 0.099 if Vin >= 0.018 + + where Vin and Vout are measured on a scale of 0 to 1. Although + the exponent remains 0.45, the multiplication and subtraction + change the shape of the transfer function, so it is no longer a + pure power function. If you want to perform extremely precise + calculations on video signals, you should use the expression above + (or its inverse, as required). + + However, PNG does not provide a way to specify that an image uses + this exact transfer function; the gAMA chunk always assumes a pure + power-law function. If we plot the two-part transfer function + above along with the family of pure power functions, we find that + a power function with a gamma of about 0.5 to 0.52 (not 0.45) most + closely approximates the transfer function. Thus, when writing a + + + +Boutell, et. al. Informational [Page 88] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + PNG file with data obtained from digitizing the output of a modern + video camera, the gAMA chunk should contain 0.5 or 0.52, not 0.45. + The remaining difference between the true transfer function and + the power function is insignificant for almost all purposes. (In + fact, the alignment errors in most cameras are likely to be larger + than the difference between these functions.) The designers of + PNG deemed the simplicity and flexibility of a power-law + definition of gAMA to be more important than being able to + describe the SMPTE-170M transfer curve exactly. + + The PAL and SECAM video standards specify a power-law camera + transfer function with a gamma of 1/2.8 or 0.36 --- not the 1/2.2 + of NTSC. However, this is too low in practice, so real cameras + are likely to have their gamma set close to NTSC practice. Just + guessing 0.45 or 0.5 is likely to give you viewable results, but + if you want precise values you'll probably have to measure the + particular camera. + + Further reading + + If you have access to the World Wide Web, read Charles Poynton's + excellent "Gamma FAQ" [GAMMA-FAQ] for more information about + gamma. + +14. Appendix: Color Tutorial + + (This appendix is not part of the formal PNG specification.) + + About chromaticity + + The cHRM chunk is used, together with the gAMA chunk, to convey + precise color information so that a PNG image can be displayed or + printed with better color fidelity than is possible without this + information. The preceding chapters state how this information is + encoded in a PNG image. This tutorial briefly outlines the + underlying color theory for those who might not be familiar with + it. + + Note that displaying an image with incorrect gamma will produce + much larger color errors than failing to use the chromaticity + data. First be sure the monitor set-up and gamma correction are + right, then worry about chromaticity. + + The problem + + The color of an object depends not only on the precise spectrum of + light emitted or reflected from it, but also on the observer --- + their species, what else they can see at the same time, even what + + + +Boutell, et. al. Informational [Page 89] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + they have recently looked at! Furthermore, two very different + spectra can produce exactly the same color sensation. Color is + not an objective property of real-world objects; it is a + subjective, biological sensation. However, by making some + simplifying assumptions (such as: we are talking about human + vision) it is possible to produce a mathematical model of color + and thereby obtain good color accuracy. + + Device-dependent color + + Display the same RGB data on three different monitors, side by + side, and you will get a noticeably different color balance on + each display. This is because each monitor emits a slightly + different shade and intensity of red, green, and blue light. RGB + is an example of a device-dependent color model --- the color you + get depends on the device. This also means that a particular + color --- represented as say RGB 87, 146, 116 on one monitor --- + might have to be specified as RGB 98, 123, 104 on another to + produce the same color. + + Device-independent color + + A full physical description of a color would require specifying + the exact spectral power distribution of the light source. + Fortunately, the human eye and brain are not so sensitive as to + require exact reproduction of a spectrum. Mathematical, device- + independent color models exist that describe fairly well how a + particular color will be seen by humans. The most important + device-independent color model, to which all others can be + related, was developed by the International Lighting Committee + (CIE, in French) and is called XYZ. + + In XYZ, X is the sum of a weighted power distribution over the + whole visible spectrum. So are Y and Z, each with different + weights. Thus any arbitrary spectral power distribution is + condensed down to just three floating point numbers. The weights + were derived from color matching experiments done on human + subjects in the 1920s. CIE XYZ has been an International Standard + since 1931, and it has a number of useful properties: + + * two colors with the same XYZ values will look the same to + humans + * two colors with different XYZ values will not look the same + * the Y value represents all the brightness information + (luminance) + * the XYZ color of any object can be objectively measured + + + + + +Boutell, et. al. Informational [Page 90] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Color models based on XYZ have been used for many years by people + who need accurate control of color --- lighting engineers for film + and TV, paint and dyestuffs manufacturers, and so on. They are + thus proven in industrial use. Accurate, device-independent color + started to spread from high-end, specialized areas into the + mainstream during the late 1980s and early 1990s, and PNG takes + notice of that trend. + + Calibrated, device-dependent color + + Traditionally, image file formats have used uncalibrated, device- + dependent color. If the precise details of the original display + device are known, it becomes possible to convert the device- + dependent colors of a particular image to device-independent ones. + Making simplifying assumptions, such as working with CRTs (which + are much easier than printers), all we need to know are the XYZ + values of each primary color and the CRT_gamma. + + So why does PNG not store images in XYZ instead of RGB? Well, two + reasons. First, storing images in XYZ would require more bits of + precision, which would make the files bigger. Second, all + programs would have to convert the image data before viewing it. + Whether calibrated or not, all variants of RGB are close enough + that undemanding viewers can get by with simply displaying the + data without color correction. By storing calibrated RGB, PNG + retains compatibility with existing programs that expect RGB data, + yet provides enough information for conversion to XYZ in + applications that need precise colors. Thus, we get the best of + both worlds. + + What are chromaticity and luminance? + + Chromaticity is an objective measurement of the color of an + object, leaving aside the brightness information. Chromaticity + uses two parameters x and y, which are readily calculated from + XYZ: + + x = X / (X + Y + Z) + y = Y / (X + Y + Z) + + XYZ colors having the same chromaticity values will appear to have + the same hue but can vary in absolute brightness. Notice that x,y + are dimensionless ratios, so they have the same values no matter + what units we've used for X,Y,Z. + + + + + + + +Boutell, et. al. Informational [Page 91] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + The Y value of an XYZ color is directly proportional to its + absolute brightness and is called the luminance of the color. We + can describe a color either by XYZ coordinates or by chromaticity + x,y plus luminance Y. The XYZ form has the advantage that it is + linearly related to (linear, gamma=1.0) RGB color spaces. + + How are computer monitor colors described? + + The "white point" of a monitor is the chromaticity x,y of the + monitor's nominal white, that is, the color produced when + R=G=B=maximum. + + It's customary to specify monitor colors by giving the + chromaticities of the individual phosphors R, G, and B, plus the + white point. The white point allows one to infer the relative + brightnesses of the three phosphors, which isn't determined by + their chromaticities alone. + + Note that the absolute brightness of the monitor is not specified. + For computer graphics work, we generally don't care very much + about absolute brightness levels. Instead of dealing with + absolute XYZ values (in which X,Y,Z are expressed in physical + units of radiated power, such as candelas per square meter), it is + convenient to work in "relative XYZ" units, where the monitor's + nominal white is taken to have a luminance (Y) of 1.0. Given this + assumption, it's simple to compute XYZ coordinates for the + monitor's white, red, green, and blue from their chromaticity + values. + + Why does cHRM use x,y rather than XYZ? Simply because that is how + manufacturers print the information in their spec sheets! + Usually, the first thing a program will do is convert the cHRM + chromaticities into relative XYZ space. + + What can I do with it? + + If a PNG file has the gAMA and cHRM chunks, the source_RGB values + can be converted to XYZ. This lets you: + + * do accurate grayscale conversion (just use the Y component) + * convert to RGB for your own monitor (to see the original + colors) + * print the image in Level 2 PostScript with better color + fidelity than a simple RGB to CMYK conversion could provide + * calculate an optimal color palette + * pass the image data to a color management system + * etc. + + + + +Boutell, et. al. Informational [Page 92] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + How do I convert from source_RGB to XYZ? + + Make a few simplifying assumptions first, like the monitor really + is jet black with no input and the guns don't interfere with one + another. Then, given that you know the CIE XYZ values for each of + red, green, and blue for a particular monitor, you put them into a + matrix m: + + Xr Xg Xb + m = Yr Yg Yb + Zr Zg Zb + + Here we assume we are working with linear RGB floating point data + in the range 0..1. If the gamma is not 1.0, make it so on the + floating point data. Then convert source_RGB to XYZ by matrix + multiplication: + + X R + Y = m G + Z B + + In other words, X = Xr*R + Xg*G + Xb*B, and similarly for Y and Z. + You can go the other way too: + + R X + G = im Y + B Z + + where im is the inverse of the matrix m. + + What is a gamut? + + The gamut of a device is the subset of visible colors which that + device can display. (It has nothing to do with gamma.) The gamut + of an RGB device can be visualized as a polyhedron in XYZ space; + the vertices correspond to the device's black, blue, red, green, + magenta, cyan, yellow and white. + + Different devices have different gamuts, in other words one device + will be able to display certain colors (usually highly saturated + ones) that another device cannot. The gamut of a particular RGB + device can be determined from its R, G, and B chromaticities and + white point (the same values given in the cHRM chunk). The gamut + of a color printer is more complex and can only be determined by + measurement. However, printer gamuts are typically smaller than + monitor gamuts, meaning that there can be many colors in a + displayable image that cannot physically be printed. + + + + +Boutell, et. al. Informational [Page 93] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Converting image data from one device to another generally results + in gamut mismatches --- colors that cannot be represented exactly + on the destination device. The process of making the colors fit, + which can range from a simple clip to elaborate nonlinear scaling + transformations, is termed gamut mapping. The aim is to produce a + reasonable visual representation of the original image. + + Further reading + + References [COLOR-1] through [COLOR-5] provide more detail about + color theory. + +15. Appendix: Sample CRC Code + + The following sample code represents a practical implementation of + the CRC (Cyclic Redundancy Check) employed in PNG chunks. (See also + ISO 3309 [ISO-3309] or ITU-T V.42 [ITU-V42] for a formal + specification.) + + The sample code is in the ANSI C programming language. Non C users + may find it easier to read with these hints: + + & + Bitwise AND operator. + + ^ + Bitwise exclusive-OR operator. (Caution: elsewhere in this + document, ^ represents exponentiation.) + + >> + Bitwise right shift operator. When applied to an unsigned + quantity, as here, right shift inserts zeroes at the left. + + ! + Logical NOT operator. + + ++ + "n++" increments the variable n. + + 0xNNN + 0x introduces a hexadecimal (base 16) constant. Suffix L + indicates a long value (at least 32 bits). + + /* Table of CRCs of all 8-bit messages. */ + unsigned long crc_table[256]; + + /* Flag: has the table been computed? Initially false. */ + int crc_table_computed = 0; + + + +Boutell, et. al. Informational [Page 94] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + /* Make the table for a fast CRC. */ + void make_crc_table(void) + { + unsigned long c; + int n, k; + for (n = 0; n < 256; n++) { + c = (unsigned long) n; + for (k = 0; k < 8; k++) { + if (c & 1) + c = 0xedb88320L ^ (c >> 1); + else + c = c >> 1; + } + crc_table[n] = c; + } + crc_table_computed = 1; + } + + /* Update a running CRC with the bytes buf[0..len-1]--the CRC + should be initialized to all 1's, and the transmitted value + is the 1's complement of the final running CRC (see the + crc() routine below)). */ + + unsigned long update_crc(unsigned long crc, unsigned char *buf, + int len) + { + unsigned long c = crc; + int n; + + if (!crc_table_computed) + make_crc_table(); + for (n = 0; n < len; n++) { + c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); + } + return c; + } + + /* Return the CRC of the bytes buf[0..len-1]. */ + unsigned long crc(unsigned char *buf, int len) + { + return update_crc(0xffffffffL, buf, len) ^ 0xffffffffL; + } + + + + + + + + + +Boutell, et. al. Informational [Page 95] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + +16. Appendix: Online Resources + + (This appendix is not part of the formal PNG specification.) + + This appendix gives the locations of some Internet resources for PNG + software developers. By the nature of the Internet, the list is + incomplete and subject to change. + + Archive sites + + The latest released versions of this document and related + information can always be found at the PNG FTP archive site, + ftp://ftp.uu.net/graphics/png/. The PNG specification is + available in several formats, including HTML, plain text, and + PostScript. + + Reference implementation and test images + + A reference implementation in portable C is available from the PNG + FTP archive site, ftp://ftp.uu.net/graphics/png/src/. The + reference implementation is freely usable in all applications, + including commercial applications. + + Test images are available from + ftp://ftp.uu.net/graphics/png/images/. + + Electronic mail + + The maintainers of the PNG specification can be contacted by e- + mail at png-info@uunet.uu.net or at png-group@w3.org. + + PNG home page + + There is a World Wide Web home page for PNG at + http://quest.jpl.nasa.gov/PNG/. This page is a central location + for current information about PNG and PNG-related tools. + +17. Appendix: Revision History + + (This appendix is not part of the formal PNG specification.) + + The PNG format has been frozen since the Ninth Draft of March 7, + 1995, and all future changes are intended to be backwards compatible. + The revisions since the Ninth Draft are simply clarifications, + improvements in presentation, and additions of supporting material. + + On 1 October 1996, the PNG specification was approved as a W3C (World + Wide Web Consortium) Recommendation. + + + +Boutell, et. al. Informational [Page 96] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + Changes since the Tenth Draft of 5 May, 1995 + + * Clarified meaning of a suggested-palette PLTE chunk in a + truecolor image that uses transparency + * Clarified exact semantics of sBIT and allowed sample depth + scaling procedures + * Clarified status of spaces in tEXt chunk keywords + * Distinguished private and public extension values in type + and method fields + * Added a "Creation Time" tEXt keyword + * Macintosh representation of PNG specified + * Added discussion of security issues + * Added more extensive discussion of gamma and chromaticity + handling, including tutorial appendixes + * Clarified terminology, notably sample depth vs. bit depth + * Added a glossary + * Editing and reformatting + +18. References + + [COLOR-1] + Hall, Roy, Illumination and Color in Computer Generated Imagery. + Springer-Verlag, New York, 1989. ISBN 0-387-96774-5. + + [COLOR-2] + Kasson, J., and W. Plouffe, "An Analysis of Selected Computer + Interchange Color Spaces", ACM Transactions on Graphics, vol 11 no + 4 (1992), pp 373-405. + + [COLOR-3] + Lilley, C., F. Lin, W.T. Hewitt, and T.L.J. Howard, Colour in + Computer Graphics. CVCP, Sheffield, 1993. ISBN 1-85889-022-5. + Also available from + <URL:http://info.mcc.ac.uk/CGU/ITTI/Col/colour_announce.html> + + [COLOR-4] + Stone, M.C., W.B. Cowan, and J.C. Beatty, "Color gamut mapping and + the printing of digital images", ACM Transactions on Graphics, vol + 7 no 3 (1988), pp 249-292. + + [COLOR-5] + Travis, David, Effective Color Displays --- Theory and Practice. + Academic Press, London, 1991. ISBN 0-12-697690-2. + + [GAMMA-FAQ] + Poynton, C., "Gamma FAQ". + <URL:http://www.inforamp.net/%7Epoynton/Poynton-colour.html> + + + + +Boutell, et. al. Informational [Page 97] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + [ISO-3309] + International Organization for Standardization, "Information + Processing Systems --- Data Communication High-Level Data Link + Control Procedure --- Frame Structure", IS 3309, October 1984, 3rd + Edition. + + [ISO-8859] + International Organization for Standardization, "Information + Processing --- 8-bit Single-Byte Coded Graphic Character Sets --- + Part 1: Latin Alphabet No. 1", IS 8859-1, 1987. + Also see sample files at + ftp://ftp.uu.net/graphics/png/documents/iso_8859-1.* + + [ITU-BT709] + International Telecommunications Union, "Basic Parameter Values + for the HDTV Standard for the Studio and for International + Programme Exchange", ITU-R Recommendation BT.709 (formerly CCIR + Rec. 709), 1990. + + [ITU-V42] + International Telecommunications Union, "Error-correcting + Procedures for DCEs Using Asynchronous-to-Synchronous Conversion", + ITU-T Recommendation V.42, 1994, Rev. 1. + + [PAETH] + Paeth, A.W., "Image File Compression Made Easy", in Graphics Gems + II, James Arvo, editor. Academic Press, San Diego, 1991. ISBN + 0-12-064480-0. + + [POSTSCRIPT] + Adobe Systems Incorporated, PostScript Language Reference Manual, + 2nd edition. Addison-Wesley, Reading, 1990. ISBN 0-201-18127-4. + + [PNG-EXTENSIONS] + PNG Group, "PNG Special-Purpose Public Chunks". Available in + several formats from + ftp://ftp.uu.net/graphics/png/documents/pngextensions.* + + [RFC-1123] + Braden, R., Editor, "Requirements for Internet Hosts --- + Application and Support", STD 3, RFC 1123, USC/Information + Sciences Institute, October 1989. + <URL:ftp://ds.internic.net/rfc/rfc1123.txt> + + + + + + + + +Boutell, et. al. Informational [Page 98] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + [RFC-2045] + Freed, N., and N. Borenstein, "Multipurpose Internet Mail + Extensions (MIME) Part One: Format of Internet Message Bodies", + RFC 2045, Innosoft, First Virtual, November 1996. + <URL:ftp://ds.internic.net/rfc/rfc2045.txt> + + [RFC-2048] + Freed, N., Klensin, J., and J. Postel, "Multipurpose Internet Mail + Extensions (MIME) Part Four: Registration Procedures", RFC 2048, + Innosoft, MCI, USC/Information Sciences Institute, November 1996. + <URL:ftp://ds.internic.net/rfc/rfc2048.txt> + + [RFC-1950] + Deutsch, P. and J-L. Gailly, "ZLIB Compressed Data Format + Specification version 3.3", RFC 1950, Aladdin Enterprises, May + 1996. + <URL:ftp://ds.internic.net/rfc/rfc1950.txt> + + [RFC-1951] + Deutsch, P., "DEFLATE Compressed Data Format Specification version + 1.3", RFC 1951, Aladdin Enterprises, May 1996. + <URL:ftp://ds.internic.net/rfc/rfc1951.txt> + + [SMPTE-170M] + Society of Motion Picture and Television Engineers, "Television + --- Composite Analog Video Signal --- NTSC for Studio + Applications", SMPTE-170M, 1994. + + + + + + + + + + + + + + + + + + + + + + + + +Boutell, et. al. Informational [Page 99] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + +19. Credits + + Editor + + Thomas Boutell, boutell@boutell.com + + Contributing Editor + + Tom Lane, tgl@sss.pgh.pa.us + + Authors + + Authors' names are presented in alphabetical order. + + * Mark Adler, madler@alumni.caltech.edu + * Thomas Boutell, boutell@boutell.com + * Christian Brunschen, cb@df.lth.se + * Adam M. Costello, amc@cs.berkeley.edu + * Lee Daniel Crocker, lee@piclab.com + * Andreas Dilger, adilger@enel.ucalgary.ca + * Oliver Fromme, fromme@rz.tu-clausthal.de + * Jean-loup Gailly, gzip@prep.ai.mit.edu + * Chris Herborth, chrish@qnx.com + * Alex Jakulin, Aleks.Jakulin@snet.fri.uni-lj.si + * Neal Kettler, kettler@cs.colostate.edu + * Tom Lane, tgl@sss.pgh.pa.us + * Alexander Lehmann, alex@hal.rhein-main.de + * Chris Lilley, chris@w3.org + * Dave Martindale, davem@cs.ubc.ca + * Owen Mortensen, 104707.650@compuserve.com + * Keith S. Pickens, ksp@swri.edu + * Robert P. Poole, lionboy@primenet.com + * Glenn Randers-Pehrson, glennrp@arl.mil or + randeg@alumni.rpi.edu + * Greg Roelofs, newt@pobox.com + * Willem van Schaik, willem@gintic.gov.sg + * Guy Schalnat + * Paul Schmidt, pschmidt@photodex.com + * Tim Wegner, 71320.675@compuserve.com + * Jeremy Wohl, jeremyw@anders.com + + The authors wish to acknowledge the contributions of the Portable + Network Graphics mailing list, the readers of comp.graphics, and + the members of the World Wide Web Consortium (W3C). + + + + + + + +Boutell, et. al. Informational [Page 100] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + The Adam7 interlacing scheme is not patented and it is not the + intention of the originator of that scheme to patent it. The + scheme may be freely used by all PNG implementations. The name + "Adam7" may be freely used to describe interlace method 1 of the + PNG specification. + + Trademarks + + GIF is a service mark of CompuServe Incorporated. IBM PC is a + trademark of International Business Machines Corporation. + Macintosh is a trademark of Apple Computer, Inc. Microsoft and + MS-DOS are trademarks of Microsoft Corporation. PhotoCD is a + trademark of Eastman Kodak Company. PostScript and TIFF are + trademarks of Adobe Systems Incorporated. SGI is a trademark of + Silicon Graphics, Inc. X Window System is a trademark of the + Massachusetts Institute of Technology. + +COPYRIGHT NOTICE + + Copyright (c) 1996 by: Massachusetts Institute of Technology (MIT) + + This W3C specification is being provided by the copyright holders + under the following license. By obtaining, using and/or copying this + specification, you agree that you have read, understood, and will + comply with the following terms and conditions: + + Permission to use, copy, and distribute this specification for any + purpose and without fee or royalty is hereby granted, provided that + the full text of this NOTICE appears on ALL copies of the + specification or portions thereof, including modifications, that you + make. + + THIS SPECIFICATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO + REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF + EXAMPLE, BUT NOT LIMITATION, COPYRIGHT HOLDERS MAKE NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY + PARTICULAR PURPOSE OR THAT THE USE OF THE SPECIFICATION WILL NOT + INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER + RIGHTS. COPYRIGHT HOLDERS WILL BEAR NO LIABILITY FOR ANY USE OF THIS + SPECIFICATION. + + + + + + + + + + + +Boutell, et. al. Informational [Page 101] + +RFC 2083 PNG: Portable Network Graphics March 1997 + + + The name and trademarks of copyright holders may NOT be used in + advertising or publicity pertaining to the specification without + specific, written prior permission. Title to copyright in this + specification and any associated documentation will at all times + remain with copyright holders. + +Security Considerations + + Security issues are discussed in Security considerations (Section + 8.5). + +Author's Address + + Thomas Boutell + PO Box 20837 + Seattle, WA 98102 + + Phone: (206) 329-4969 + EMail: boutell@boutell.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Boutell, et. al. Informational [Page 102] + |