📄 libjpeg.doc
字号:
USING THE IJG JPEG LIBRARYCopyright (C) 1994-1998, Thomas G. Lane.This file is part of the Independent JPEG Group's software.For conditions of distribution and use, see the accompanying README file.This file describes how to use the IJG JPEG library within an applicationprogram. Read it if you want to write a program that uses the library.The file example.c provides heavily commented skeleton code for calling theJPEG library. Also see jpeglib.h (the include file to be used by applicationprograms) for full details about data structures and function parameter lists.The library source code, of course, is the ultimate reference.Note that there have been *major* changes from the application interfacepresented by IJG version 4 and earlier versions. The old design had severalinherent limitations, and it had accumulated a lot of cruft as we addedfeatures while trying to minimize application-interface changes. We havesacrificed backward compatibility in the version 5 rewrite, but we think theimprovements justify this.TABLE OF CONTENTS-----------------Overview: Functions provided by the library Outline of typical usageBasic library usage: Data formats Compression details Decompression details Mechanics of usage: include files, linking, etcAdvanced features: Compression parameter selection Decompression parameter selection Special color spaces Error handling Compressed data handling (source and destination managers) I/O suspension Progressive JPEG support Buffered-image mode Abbreviated datastreams and multiple images Special markers Raw (downsampled) image data Really raw data: DCT coefficients Progress monitoring Memory management Memory usage Library compile-time options Portability considerations Notes for MS-DOS implementorsYou should read at least the overview and basic usage sections before tryingto program with the library. The sections on advanced features can be readif and when you need them.OVERVIEW========Functions provided by the library---------------------------------The IJG JPEG library provides C code to read and write JPEG-compressed imagefiles. The surrounding application program receives or supplies image data ascanline at a time, using a straightforward uncompressed image format. Alldetails of color conversion and other preprocessing/postprocessing can behandled by the library.The library includes a substantial amount of code that is not covered by theJPEG standard but is necessary for typical applications of JPEG. Thesefunctions preprocess the image before JPEG compression or postprocess it afterdecompression. They include colorspace conversion, downsampling/upsampling,and color quantization. The application indirectly selects use of this codeby specifying the format in which it wishes to supply or receive image data.For example, if colormapped output is requested, then the decompressionlibrary automatically invokes color quantization.A wide range of quality vs. speed tradeoffs are possible in JPEG processing,and even more so in decompression postprocessing. The decompression libraryprovides multiple implementations that cover most of the useful tradeoffs,ranging from very-high-quality down to fast-preview operation. On thecompression side we have generally not provided low-quality choices, sincecompression is normally less time-critical. It should be understood that thelow-quality modes may not meet the JPEG standard's accuracy requirements;nonetheless, they are useful for viewers.A word about functions *not* provided by the library. We handle a subset ofthe ISO JPEG standard; most baseline, extended-sequential, and progressiveJPEG processes are supported. (Our subset includes all features now in commonuse.) Unsupported ISO options include: * Hierarchical storage * Lossless JPEG * Arithmetic entropy coding (unsupported for legal reasons) * DNL marker * Nonintegral subsampling ratiosWe support both 8- and 12-bit data precision, but this is a compile-timechoice rather than a run-time choice; hence it is difficult to use bothprecisions in a single application.By itself, the library handles only interchange JPEG datastreams --- inparticular the widely used JFIF file format. The library can be used bysurrounding code to process interchange or abbreviated JPEG datastreams thatare embedded in more complex file formats. (For example, this library isused by the free LIBTIFF library to support JPEG compression in TIFF.)Outline of typical usage------------------------The rough outline of a JPEG compression operation is: Allocate and initialize a JPEG compression object Specify the destination for the compressed data (eg, a file) Set parameters for compression, including image size & colorspace jpeg_start_compress(...); while (scan lines remain to be written) jpeg_write_scanlines(...); jpeg_finish_compress(...); Release the JPEG compression objectA JPEG compression object holds parameters and working state for the JPEGlibrary. We make creation/destruction of the object separate from startingor finishing compression of an image; the same object can be re-used for aseries of image compression operations. This makes it easy to re-use thesame parameter settings for a sequence of images. Re-use of a JPEG objectalso has important implications for processing abbreviated JPEG datastreams,as discussed later.The image data to be compressed is supplied to jpeg_write_scanlines() fromin-memory buffers. If the application is doing file-to-file compression,reading image data from the source file is the application's responsibility.The library emits compressed data by calling a "data destination manager",which typically will write the data into a file; but the application canprovide its own destination manager to do something else.Similarly, the rough outline of a JPEG decompression operation is: Allocate and initialize a JPEG decompression object Specify the source of the compressed data (eg, a file) Call jpeg_read_header() to obtain image info Set parameters for decompression jpeg_start_decompress(...); while (scan lines remain to be read) jpeg_read_scanlines(...); jpeg_finish_decompress(...); Release the JPEG decompression objectThis is comparable to the compression outline except that reading thedatastream header is a separate step. This is helpful because informationabout the image's size, colorspace, etc is available when the applicationselects decompression parameters. For example, the application can choose anoutput scaling ratio that will fit the image into the available screen size.The decompression library obtains compressed data by calling a data sourcemanager, which typically will read the data from a file; but other behaviorscan be obtained with a custom source manager. Decompressed data is deliveredinto in-memory buffers passed to jpeg_read_scanlines().It is possible to abort an incomplete compression or decompression operationby calling jpeg_abort(); or, if you do not need to retain the JPEG object,simply release it by calling jpeg_destroy().JPEG compression and decompression objects are two separate struct types.However, they share some common fields, and certain routines such asjpeg_destroy() can work on either type of object.The JPEG library has no static variables: all state is in the compressionor decompression object. Therefore it is possible to process multiplecompression and decompression operations concurrently, using multiple JPEGobjects.Both compression and decompression can be done in an incremental memory-to-memory fashion, if suitable source/destination managers are used. See thesection on "I/O suspension" for more details.BASIC LIBRARY USAGE===================Data formats------------Before diving into procedural details, it is helpful to understand theimage data format that the JPEG library expects or returns.The standard input image format is a rectangular array of pixels, with eachpixel having the same number of "component" or "sample" values (colorchannels). You must specify how many components there are and the colorspaceinterpretation of the components. Most applications will use RGB data(three components per pixel) or grayscale data (one component per pixel).PLEASE NOTE THAT RGB DATA IS THREE SAMPLES PER PIXEL, GRAYSCALE ONLY ONE.A remarkable number of people manage to miss this, only to find that theirprograms don't work with grayscale JPEG files.There is no provision for colormapped input. JPEG files are always full-coloror full grayscale (or sometimes another colorspace such as CMYK). You canfeed in a colormapped image by expanding it to full-color format. HoweverJPEG often doesn't work very well with source data that has been colormapped,because of dithering noise. This is discussed in more detail in the JPEG FAQand the other references mentioned in the README file.Pixels are stored by scanlines, with each scanline running from left toright. The component values for each pixel are adjacent in the row; forexample, R,G,B,R,G,B,R,G,B,... for 24-bit RGB color. Each scanline is anarray of data type JSAMPLE --- which is typically "unsigned char", unlessyou've changed jmorecfg.h. (You can also change the RGB pixel layout, sayto B,G,R order, by modifying jmorecfg.h. But see the restrictions listed inthat file before doing so.)A 2-D array of pixels is formed by making a list of pointers to the starts ofscanlines; so the scanlines need not be physically adjacent in memory. Evenif you process just one scanline at a time, you must make a one-elementpointer array to conform to this structure. Pointers to JSAMPLE rows are oftype JSAMPROW, and the pointer to the pointer array is of type JSAMPARRAY.The library accepts or supplies one or more complete scanlines per call.It is not possible to process part of a row at a time. Scanlines are alwaysprocessed top-to-bottom. You can process an entire image in one call if youhave it all in memory, but usually it's simplest to process one scanline ata time.For best results, source data values should have the precision specified byBITS_IN_JSAMPLE (normally 8 bits). For instance, if you choose to compressdata that's only 6 bits/channel, you should left-justify each value in abyte before passing it to the compressor. If you need to compress datathat has more than 8 bits/channel, compile with BITS_IN_JSAMPLE = 12.(See "Library compile-time options", later.)The data format returned by the decompressor is the same in all details,except that colormapped output is supported. (Again, a JPEG file is nevercolormapped. But you can ask the decompressor to perform on-the-fly colorquantization to deliver colormapped output.) If you request colormappedoutput then the returned data array contains a single JSAMPLE per pixel;its value is an index into a color map. The color map is represented asa 2-D JSAMPARRAY in which each row holds the values of one color component,that is, colormap[i][j] is the value of the i'th color component for pixelvalue (map index) j. Note that since the colormap indexes are stored inJSAMPLEs, the maximum number of colors is limited by the size of JSAMPLE(ie, at most 256 colors for an 8-bit JPEG library).Compression details-------------------Here we revisit the JPEG compression outline given in the overview.1. Allocate and initialize a JPEG compression object.A JPEG compression object is a "struct jpeg_compress_struct". (It also hasa bunch of subsidiary structures which are allocated via malloc(), but theapplication doesn't control those directly.) This struct can be just a localvariable in the calling routine, if a single routine is going to execute thewhole JPEG compression sequence. Otherwise it can be static or allocatedfrom malloc().You will also need a structure representing a JPEG error handler. The partof this that the library cares about is a "struct jpeg_error_mgr". If youare providing your own error handler, you'll typically want to embed thejpeg_error_mgr struct in a larger structure; this is discussed later under"Error handling". For now we'll assume you are just using the default errorhandler. The default error handler will print JPEG error/warning messageson stderr, and it will call exit() if a fatal error occurs.You must initialize the error handler structure, store a pointer to it intothe JPEG object's "err" field, and then call jpeg_create_compress() toinitialize the rest of the JPEG object.Typical code for this step, if you are using the default error handler, is struct jpeg_compress_struct cinfo;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -