source: josm/trunk/src/com/drew/metadata/exif/ExifReader.java@ 12187

Last change on this file since 12187 was 10862, checked in by Don-vip, 8 years ago

update to metadata-extractor 2.9.1

File size: 4.1 KB
Line 
1/*
2 * Copyright 2002-2016 Drew Noakes
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 * More information about this project is available at:
17 *
18 * https://drewnoakes.com/code/exif/
19 * https://github.com/drewnoakes/metadata-extractor
20 */
21package com.drew.metadata.exif;
22
23import com.drew.imaging.jpeg.JpegSegmentMetadataReader;
24import com.drew.imaging.jpeg.JpegSegmentType;
25import com.drew.imaging.tiff.TiffProcessingException;
26import com.drew.imaging.tiff.TiffReader;
27import com.drew.lang.ByteArrayReader;
28import com.drew.lang.RandomAccessReader;
29import com.drew.lang.annotations.NotNull;
30import com.drew.lang.annotations.Nullable;
31import com.drew.metadata.Directory;
32import com.drew.metadata.Metadata;
33
34import java.io.IOException;
35import java.util.Collections;
36
37/**
38 * Decodes Exif binary data, populating a {@link Metadata} object with tag values in {@link ExifSubIFDDirectory},
39 * {@link ExifThumbnailDirectory}, {@link ExifInteropDirectory}, {@link GpsDirectory} and one of the many camera
40 * makernote directories.
41 *
42 * @author Drew Noakes https://drewnoakes.com
43 */
44public class ExifReader implements JpegSegmentMetadataReader
45{
46 /** Exif data stored in JPEG files' APP1 segment are preceded by this six character preamble. */
47 public static final String JPEG_SEGMENT_PREAMBLE = "Exif\0\0";
48
49 private boolean _storeThumbnailBytes = true;
50
51 public boolean isStoreThumbnailBytes()
52 {
53 return _storeThumbnailBytes;
54 }
55
56 public void setStoreThumbnailBytes(boolean storeThumbnailBytes)
57 {
58 _storeThumbnailBytes = storeThumbnailBytes;
59 }
60
61 @NotNull
62 public Iterable<JpegSegmentType> getSegmentTypes()
63 {
64 return Collections.singletonList(JpegSegmentType.APP1);
65 }
66
67 public void readJpegSegments(@NotNull final Iterable<byte[]> segments, @NotNull final Metadata metadata, @NotNull final JpegSegmentType segmentType)
68 {
69 assert(segmentType == JpegSegmentType.APP1);
70
71 for (byte[] segmentBytes : segments) {
72 // Filter any segments containing unexpected preambles
73 if (segmentBytes.length < JPEG_SEGMENT_PREAMBLE.length() || !new String(segmentBytes, 0, JPEG_SEGMENT_PREAMBLE.length()).equals(JPEG_SEGMENT_PREAMBLE))
74 continue;
75 extract(new ByteArrayReader(segmentBytes), metadata, JPEG_SEGMENT_PREAMBLE.length());
76 }
77 }
78
79 /** Reads TIFF formatted Exif data from start of the specified {@link RandomAccessReader}. */
80 public void extract(@NotNull final RandomAccessReader reader, @NotNull final Metadata metadata)
81 {
82 extract(reader, metadata, 0);
83 }
84
85 /** Reads TIFF formatted Exif data a specified offset within a {@link RandomAccessReader}. */
86 public void extract(@NotNull final RandomAccessReader reader, @NotNull final Metadata metadata, int readerOffset)
87 {
88 extract(reader, metadata, readerOffset, null);
89 }
90
91 /** Reads TIFF formatted Exif data a specified offset within a {@link RandomAccessReader}. */
92 public void extract(@NotNull final RandomAccessReader reader, @NotNull final Metadata metadata, int readerOffset, @Nullable Directory parentDirectory)
93 {
94 try {
95 // Read the TIFF-formatted Exif data
96 new TiffReader().processTiff(
97 reader,
98 new ExifTiffHandler(metadata, _storeThumbnailBytes, parentDirectory),
99 readerOffset
100 );
101 } catch (TiffProcessingException e) {
102 // TODO what do to with this error state?
103 e.printStackTrace(System.err);
104 } catch (IOException e) {
105 // TODO what do to with this error state?
106 e.printStackTrace(System.err);
107 }
108 }
109}
Note: See TracBrowser for help on using the repository browser.