Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: com/drew/imaging/jpeg/JpegMetadataReader.java


1   /*
2    * Created by dnoakes on 12-Nov-2002 18:51:36 using IntelliJ IDEA.
3    */
4   package com.drew.imaging.jpeg;
5   
6   import com.drew.metadata.*;
7   import com.drew.metadata.exif.ExifReader;
8   import com.drew.metadata.iptc.IptcReader;
9   import com.sun.image.codec.jpeg.JPEGDecodeParam;
10  
11  import java.io.File;
12  import java.io.FileNotFoundException;
13  import java.io.InputStream;
14  import java.util.Iterator;
15  
16  /**
17   *
18   */
19  public class JpegMetadataReader
20  {
21      public static Metadata readMetadata(InputStream in) throws JpegProcessingException
22      {
23          JpegSegmentReader segmentReader = new JpegSegmentReader(in);
24          return extractJpegSegmentReaderMetadata(segmentReader);
25      }
26  
27      public static Metadata readMetadata(File file) throws FileNotFoundException, JpegProcessingException
28      {
29          JpegSegmentReader segmentReader = new JpegSegmentReader(file);
30          return extractJpegSegmentReaderMetadata(segmentReader);
31      }
32  
33      private static Metadata extractJpegSegmentReaderMetadata(JpegSegmentReader segmentReader)
34      {
35          Metadata metadata = new Metadata();
36          try {
37              byte[] exifSegment = segmentReader.readSegment(JpegSegmentReader.SEGMENT_APP1);
38              new ExifReader(exifSegment).extract(metadata);
39          } catch (JpegProcessingException e) {
40              // in the interests of catching as much data as possible, continue
41              // TODO lodge error message within exif directory?
42          }
43          try {
44              byte[] iptcSegment = segmentReader.readSegment(JpegSegmentReader.SEGMENT_APPD);
45              new IptcReader(iptcSegment).extract(metadata);
46          } catch (JpegProcessingException e) {
47              // TODO lodge error message within iptc directory?
48          }
49          return metadata;
50      }
51  
52      public static Metadata readMetadata(JPEGDecodeParam decodeParam)
53      {
54          Metadata metadata = new Metadata();
55  
56          /* We should only really be seeing Exif in _data[0]... the 2D array exists
57           * because markers can theoretically appear multiple times in the file.
58           */
59          byte[][] exifSegment = decodeParam.getMarkerData(JPEGDecodeParam.APP1_MARKER);
60          if (exifSegment != null && exifSegment[0].length>0) {
61              new ExifReader(exifSegment[0]).extract();
62          }
63  
64          // similarly, use only the first IPTC segment
65          byte[][] iptcSegment = decodeParam.getMarkerData(JPEGDecodeParam.APPD_MARKER);
66          if (iptcSegment != null && iptcSegment[0].length>0) {
67              new IptcReader(iptcSegment[0]).extract();
68          }
69          return metadata;
70      }
71  
72      private JpegMetadataReader()
73      {
74      }
75  
76      public static void main(String[] args)
77      {
78          JpegMetadataReader jpegReader = new JpegMetadataReader();
79          Metadata metadata = null;
80          try {
81              metadata = jpegReader.readMetadata(new File(args[0]));
82          } catch (Exception e) {
83              e.printStackTrace(System.err);
84              System.exit(1);
85          }
86  
87          // iterate over the exif data and print to System.out
88          Iterator directories = metadata.getDirectoryIterator();
89          while (directories.hasNext()) {
90              Directory directory = (Directory)directories.next();
91              Iterator tags = directory.getTagIterator();
92              while (tags.hasNext()) {
93                  Tag tag = (Tag)tags.next();
94                  try {
95                      System.out.println("[" + directory.getName() + "] " + tag.getTagName() + " = " + tag.getDescription());
96                  } catch (MetadataException e) {
97                      System.err.println(e.getMessage());
98                      System.err.println(tag.getDirectoryName() + " " + tag.getTagName() + " <error>");
99                  }
100             }
101             if (directory.hasErrors()) {
102                 Iterator errors = directory.getErrors();
103                 while (errors.hasNext()) {
104                     System.out.println("ERROR: " + errors.next());
105                 }
106             }
107         }
108     }
109 }