public TIFFNode getExifMetadata() throws IOException {
   readHeader();
   return er.getMetaDataTree();
 }
  /** Reads the header. Does nothing if the header has already been loaded. */
  private void readHeader() throws IOException {
    if (numImages == -1) {
      ImageInputStream in = (ImageInputStream) getInput();
      in.seek(0);
      er = new EXIFReader(in);
      er.setFirstImageOnly(false);
      er.read();

      // Get some information that is easy to obtain through a map
      {
        HashMap<TIFFTag, TIFFField> m = er.getMetaDataMap();
        TIFFField mde;
        if ((mde = m.get(MPFTagSet.get(MPFTagSet.TAG_NumberOfImages))) != null) {
          numImages = ((Number) mde.getData()).intValue();
        } else {
          numImages = 1;
        }
        if ((mde = m.get(EXIFTagSet.PixelXDimension)) != null) {
          width = ((Number) mde.getData()).intValue();
        }
        if ((mde = m.get(EXIFTagSet.PixelYDimension)) != null) {
          height = ((Number) mde.getData()).intValue();
        }
      }
      imageOffsets = new long[numImages];
      imageLengths = new long[numImages];
      if (numImages == 1) {
        imageOffsets[0] = 0;
        imageLengths[0] = in.length();
      }

      // Get now at the tough part
      int index = 0;
      for (Iterator<TIFFNode> e = er.getMetaDataTree().preorderIterator(); e.hasNext(); ) {
        TIFFNode n = e.next();
        if (n instanceof TIFFDirectory) {
          TIFFDirectory dir = (TIFFDirectory) n;
          // System.out.println("dir:" + dir.getName());
          if (dir.getName() != null && dir.getName().equals("MPEntry")) {
            long dirOffset = dir.getFileSegments().get(0).getOffset();
            TIFFField offsetField = dir.getField(MPEntryTagSet.IndividualImageDataOffset);
            TIFFField lengthField = dir.getField(MPEntryTagSet.IndividualImageSize);
            if (offsetField != null && lengthField != null) {
              long dataOffset = (Long) offsetField.getData();
              imageOffsets[index] = dataOffset == 0 ? 0 : dirOffset + dataOffset;
              imageLengths[index] = (Long) lengthField.getData();
              index++;
            }
          }
        }
      }

      // Store metadata for later access
      String formatName = "com_sun_media_imageio_plugins_tiff_image_1.0";
      imageMetadata = new IIOMetadata[numImages];
      for (int i = 0; i < numImages; i++) {
        imageMetadata[i] = new DefaultIIOMetadata(formatName, er.getIIOMetadataTree(formatName, i));
      }

      in.seek(0);
    }
  }