ExifReader.java revision e8d1bf7a439450b9979701909164a6baffbe8bae
15c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn/* 25c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * Copyright (C) 2012 The Android Open Source Project 35c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * 45c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 55c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * you may not use this file except in compliance with the License. 65c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * You may obtain a copy of the License at 75c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * 85c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 95c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * 105c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * Unless required by applicable law or agreed to in writing, software 115c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 125c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * See the License for the specific language governing permissions and 145c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * limitations under the License. 155c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn */ 165c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn 175c1637087453de15e31861f073eae5133c4e9f7bDianne Hackbornpackage com.android.gallery3d.exif; 185c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn 195c1637087453de15e31861f073eae5133c4e9f7bDianne Hackbornimport android.util.Log; 205c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn 215c1637087453de15e31861f073eae5133c4e9f7bDianne Hackbornimport java.io.IOException; 220574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganovimport java.io.InputStream; 230574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov 240574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov/** 250574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov * This class reads the EXIF header of a JPEG file and stores it in 26c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banes * {@link ExifData}. 270574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov */ 280574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganovclass ExifReader { 290574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov private static final String TAG = "ExifReader"; 300574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov 310574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov private final ExifInterface mInterface; 320574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov 330574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov ExifReader(ExifInterface iRef) { 345c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn mInterface = iRef; 355c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn } 365c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn 374d4589b25b82d46a24e5b09bfc9b36de138ff42bSérgio Faria /** 385c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * Parses the inputStream and and returns the EXIF data in an 395c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * {@link ExifData}. 405c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * 415c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * @throws ExifInvalidFormatException 425c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn * @throws IOException 435c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn */ 445c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn protected ExifData read(InputStream inputStream) throws ExifInvalidFormatException, 455c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn IOException { 465c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn ExifParser parser = ExifParser.parse(inputStream, mInterface); 475c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn ExifData exifData = new ExifData(parser.getByteOrder()); 485c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn ExifTag tag = null; 495c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn 505c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn int event = parser.next(); 515c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn while (event != ExifParser.EVENT_END) { 525c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn switch (event) { 535c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn case ExifParser.EVENT_START_OF_IFD: 545c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn exifData.addIfdData(new IfdData(parser.getCurrentIfd())); 555c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn break; 565c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn case ExifParser.EVENT_NEW_TAG: 575c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn tag = parser.getTag(); 585c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn if (!tag.hasValue()) { 59c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banes parser.registerForTagValue(tag); 60c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banes } else { 615c1637087453de15e31861f073eae5133c4e9f7bDianne Hackborn exifData.getIfdData(tag.getIfd()).setTag(tag); 62 } 63 break; 64 case ExifParser.EVENT_VALUE_OF_REGISTERED_TAG: 65 tag = parser.getTag(); 66 if (tag.getDataType() == ExifTag.TYPE_UNDEFINED) { 67 parser.readFullTagValue(tag); 68 } 69 exifData.getIfdData(tag.getIfd()).setTag(tag); 70 break; 71 case ExifParser.EVENT_COMPRESSED_IMAGE: 72 byte buf[] = new byte[parser.getCompressedImageSize()]; 73 if (buf.length == parser.read(buf)) { 74 exifData.setCompressedThumbnail(buf); 75 } else { 76 Log.w(TAG, "Failed to read the compressed thumbnail"); 77 } 78 break; 79 case ExifParser.EVENT_UNCOMPRESSED_STRIP: 80 buf = new byte[parser.getStripSize()]; 81 if (buf.length == parser.read(buf)) { 82 exifData.setStripBytes(parser.getStripIndex(), buf); 83 } else { 84 Log.w(TAG, "Failed to read the strip bytes"); 85 } 86 break; 87 } 88 event = parser.next(); 89 } 90 return exifData; 91 } 92} 93