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 }