## org.w3c.tools.jpeg
Class Exif

    java.lang.Object
      |
      +--org.w3c.tools.jpeg.Exif

public class Exif
extends java.lang.Object

An API for accessing EXIF encoded information in a JPEG file.

JPEG images are stored in a tagged format reminiscent of TIFF files. Each component of the image is identified with a tag number and a size. This allows applications that read JPEG files to skip over information that they don't understand.

Additional resources:

- Official standards, http://www.exif.org/specifications.html
- TsuruZoh Tachibanaya's excellent description, http://www.ba.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html
- Matthias Wandel's JHead, http://www.sentex.net/~mwandel/jhead

This class treats a byte array as a JPEG image and parses the tags searching for EXIF data. EXIF data is also tagged. Based on information provided by the caller, this class builds a hash of EXIF data and makes it available to the caller.

Most simple EXIF values are tagged with both their identity and their format. For example, ExposureTime (0x829A) is a rational number and this class can extract that value. However, some fields are of "unknown" format. If you decode one of these, you can add a special purpose decode for that field by associating the name of the decoder class with the field name. For example, my Nikon CoolPix 950 includes a MakerNote (0x927C) field that's tagged "unknown" format. Using information from TsuruZoh's page, I've built a decoder for that field and added it as an example.

In addition to the tagged data, JPEG images have five intrinisic properties: height, width, the compression algorithm used, the number of bits used to store each pixel value, and the number of color components. This class allows the caller to unify those intrinsic components with the tagged data.

In an effort to be flexible without requiring users to change the source, a fair bit of setup is needed to use this class.

The caller must:

1. Construct an Exif object, `exif = new Exif()`.
2. Associate names with each of the tags of interest, `exif.addTag(nnn, "name")`.
3. Associate names with the intrinsic values:
   - `exif.addHeight("name")`
   - `exif.addWidth("name")`
   - `exif.addCompression("name")`
   - `exif.addNumberOfColorComponents("name")`
   - `exif.addBitsPerPixel("name")`
4. Finally, the caller may associate a decoder with specific fields: `exif.addDecoder("name", "java.class.name")`.

Having setup the exif object, it can be passed to JpegHeaders to be filled in when the JPEG file is parsed.

The caller must also explicitly set the intrinsic values since they do not come from the EXIF data.

After parsing the JPEG, call `exif.getTags()` to get back the has of name/value pairs.

See Also:
  `ExifData`, `TagDecoder`, `JpegHeaders`

Constructor Summary
`Exif()`

Method Summary
`void` `addBitsPerPixel(java.lang.String name)`
`void` `addCompression(java.lang.String name)`
`void` `addDecoder(java.lang.String name, java.lang.String className)`
`void` `addHeight(java.lang.String name)`
`void` `addNumberOfColorComponents(java.lang.String name)`
`void` `addTag(int tag, java.lang.String tagName)`
`void` `addWidth(java.lang.String name)`
`protected void` `assignByte(java.lang.String tagName, int offset)`
`protected void` `assignRational(java.lang.String tagName, int offset)`
`protected void` `assignSByte(java.lang.String tagName, int offset)`
`protected void` `assignSLong(java.lang.String tagName, int offset)`
`protected void` `assignSShort(java.lang.String tagName, int offset)`
`protected void` `assignString(java.lang.String tagName, int offset, int length)`
`protected void` `assignULong(java.lang.String tagName, int offset)`
`protected void` `assignUndefined(java.lang.String tagName, int offset, int length)`
`protected void` `assignUShort(java.lang.String tagName, int offset)`
`java.util.Hashtable` `getTags()`
`void` `parseExif(byte[] exifData)`
`protected void` `processExifDir(int dirStart, int offsetBase)`
`void` `setBPP(int bitsPP)`
`void` `setCompression(java.lang.String comp)`
`void` `setHeight(int height)`
`void` `setNumCC(int numCC)`
`void` `setWidth(int width)`

Methods inherited from class java.lang.Object
`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

Constructor Detail

### Exif

    public Exif()

Method Detail

### parseExif

    public void parseExif(byte[] exifData)

### setHeight

    public void setHeight(int height)

### setWidth

    public void setWidth(int width)

### setCompression

    public void setCompression(java.lang.String comp)

### setBPP

    public void setBPP(int bitsPP)

### setNumCC

    public void setNumCC(int numCC)

### addHeight

    public void addHeight(java.lang.String name)

### addWidth

    public void addWidth(java.lang.String name)

### addCompression

    public void addCompression(java.lang.String name)

### addBitsPerPixel

    public void addBitsPerPixel(java.lang.String name)

### addNumberOfColorComponents

    public void addNumberOfColorComponents(java.lang.String name)

### addTag

    public void addTag(int tag,
                       java.lang.String tagName)

### addDecoder

    public void addDecoder(java.lang.String name,
                           java.lang.String className)

### getTags

    public java.util.Hashtable getTags()

### processExifDir

    protected void processExifDir(int dirStart,
                                  int offsetBase)

### assignUndefined

    protected void assignUndefined(java.lang.String tagName,
                                   int offset,
                                   int length)

### assignString

    protected void assignString(java.lang.String tagName,
                                int offset,
                                int length)

### assignSByte

    protected void assignSByte(java.lang.String tagName,
                               int offset)

### assignByte

    protected void assignByte(java.lang.String tagName,
                              int offset)

### assignUShort

    protected void assignUShort(java.lang.String tagName,
                                int offset)

### assignSShort

    protected void assignSShort(java.lang.String tagName,
                                int offset)

### assignULong

    protected void assignULong(java.lang.String tagName,
                               int offset)

### assignSLong

    protected void assignSLong(java.lang.String tagName,
                               int offset)

### assignRational

    protected void assignRational(java.lang.String tagName,
                                  int offset)