1104c45677660586026a7e74ef8c47d396403d50eMichael Jurka/* 2104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * Copyright (C) 2012 The Android Open Source Project 3104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * 4104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * Licensed under the Apache License, Version 2.0 (the "License"); 5104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * you may not use this file except in compliance with the License. 6104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * You may obtain a copy of the License at 7104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * 8104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * http://www.apache.org/licenses/LICENSE-2.0 9104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * 10104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * Unless required by applicable law or agreed to in writing, software 11104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * distributed under the License is distributed on an "AS IS" BASIS, 12104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * See the License for the specific language governing permissions and 14104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * limitations under the License. 15104c45677660586026a7e74ef8c47d396403d50eMichael Jurka */ 16104c45677660586026a7e74ef8c47d396403d50eMichael Jurka 17104c45677660586026a7e74ef8c47d396403d50eMichael Jurkapackage com.android.gallery3d.exif; 18104c45677660586026a7e74ef8c47d396403d50eMichael Jurka 19104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport android.util.Log; 20104c45677660586026a7e74ef8c47d396403d50eMichael Jurka 21104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport java.io.IOException; 22104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaimport java.io.InputStream; 23104c45677660586026a7e74ef8c47d396403d50eMichael Jurka 24104c45677660586026a7e74ef8c47d396403d50eMichael Jurka/** 25104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * This class reads the EXIF header of a JPEG file and stores it in 26104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * {@link ExifData}. 27104c45677660586026a7e74ef8c47d396403d50eMichael Jurka */ 28104c45677660586026a7e74ef8c47d396403d50eMichael Jurkaclass ExifReader { 29104c45677660586026a7e74ef8c47d396403d50eMichael Jurka private static final String TAG = "ExifReader"; 30104c45677660586026a7e74ef8c47d396403d50eMichael Jurka 31104c45677660586026a7e74ef8c47d396403d50eMichael Jurka private final ExifInterface mInterface; 32104c45677660586026a7e74ef8c47d396403d50eMichael Jurka 33104c45677660586026a7e74ef8c47d396403d50eMichael Jurka ExifReader(ExifInterface iRef) { 34104c45677660586026a7e74ef8c47d396403d50eMichael Jurka mInterface = iRef; 35104c45677660586026a7e74ef8c47d396403d50eMichael Jurka } 36104c45677660586026a7e74ef8c47d396403d50eMichael Jurka 37104c45677660586026a7e74ef8c47d396403d50eMichael Jurka /** 38104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * Parses the inputStream and and returns the EXIF data in an 39104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * {@link ExifData}. 40104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * 41104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * @throws ExifInvalidFormatException 42104c45677660586026a7e74ef8c47d396403d50eMichael Jurka * @throws IOException 43104c45677660586026a7e74ef8c47d396403d50eMichael Jurka */ 44104c45677660586026a7e74ef8c47d396403d50eMichael Jurka protected ExifData read(InputStream inputStream) throws ExifInvalidFormatException, 45104c45677660586026a7e74ef8c47d396403d50eMichael Jurka IOException { 46104c45677660586026a7e74ef8c47d396403d50eMichael Jurka ExifParser parser = ExifParser.parse(inputStream, mInterface); 47104c45677660586026a7e74ef8c47d396403d50eMichael Jurka ExifData exifData = new ExifData(parser.getByteOrder()); 48104c45677660586026a7e74ef8c47d396403d50eMichael Jurka ExifTag tag = null; 49104c45677660586026a7e74ef8c47d396403d50eMichael Jurka 50104c45677660586026a7e74ef8c47d396403d50eMichael Jurka int event = parser.next(); 51104c45677660586026a7e74ef8c47d396403d50eMichael Jurka while (event != ExifParser.EVENT_END) { 52104c45677660586026a7e74ef8c47d396403d50eMichael Jurka switch (event) { 53104c45677660586026a7e74ef8c47d396403d50eMichael Jurka case ExifParser.EVENT_START_OF_IFD: 54104c45677660586026a7e74ef8c47d396403d50eMichael Jurka exifData.addIfdData(new IfdData(parser.getCurrentIfd())); 55104c45677660586026a7e74ef8c47d396403d50eMichael Jurka break; 56104c45677660586026a7e74ef8c47d396403d50eMichael Jurka case ExifParser.EVENT_NEW_TAG: 57104c45677660586026a7e74ef8c47d396403d50eMichael Jurka tag = parser.getTag(); 58104c45677660586026a7e74ef8c47d396403d50eMichael Jurka if (!tag.hasValue()) { 59104c45677660586026a7e74ef8c47d396403d50eMichael Jurka parser.registerForTagValue(tag); 60104c45677660586026a7e74ef8c47d396403d50eMichael Jurka } else { 61104c45677660586026a7e74ef8c47d396403d50eMichael Jurka exifData.getIfdData(tag.getIfd()).setTag(tag); 62104c45677660586026a7e74ef8c47d396403d50eMichael Jurka } 63104c45677660586026a7e74ef8c47d396403d50eMichael Jurka break; 64104c45677660586026a7e74ef8c47d396403d50eMichael Jurka case ExifParser.EVENT_VALUE_OF_REGISTERED_TAG: 65104c45677660586026a7e74ef8c47d396403d50eMichael Jurka tag = parser.getTag(); 66104c45677660586026a7e74ef8c47d396403d50eMichael Jurka if (tag.getDataType() == ExifTag.TYPE_UNDEFINED) { 67104c45677660586026a7e74ef8c47d396403d50eMichael Jurka parser.readFullTagValue(tag); 68104c45677660586026a7e74ef8c47d396403d50eMichael Jurka } 69104c45677660586026a7e74ef8c47d396403d50eMichael Jurka exifData.getIfdData(tag.getIfd()).setTag(tag); 70104c45677660586026a7e74ef8c47d396403d50eMichael Jurka break; 71104c45677660586026a7e74ef8c47d396403d50eMichael Jurka case ExifParser.EVENT_COMPRESSED_IMAGE: 72104c45677660586026a7e74ef8c47d396403d50eMichael Jurka byte buf[] = new byte[parser.getCompressedImageSize()]; 73104c45677660586026a7e74ef8c47d396403d50eMichael Jurka if (buf.length == parser.read(buf)) { 74104c45677660586026a7e74ef8c47d396403d50eMichael Jurka exifData.setCompressedThumbnail(buf); 75104c45677660586026a7e74ef8c47d396403d50eMichael Jurka } else { 76104c45677660586026a7e74ef8c47d396403d50eMichael Jurka Log.w(TAG, "Failed to read the compressed thumbnail"); 77104c45677660586026a7e74ef8c47d396403d50eMichael Jurka } 78104c45677660586026a7e74ef8c47d396403d50eMichael Jurka break; 79104c45677660586026a7e74ef8c47d396403d50eMichael Jurka case ExifParser.EVENT_UNCOMPRESSED_STRIP: 80104c45677660586026a7e74ef8c47d396403d50eMichael Jurka buf = new byte[parser.getStripSize()]; 81104c45677660586026a7e74ef8c47d396403d50eMichael Jurka if (buf.length == parser.read(buf)) { 82104c45677660586026a7e74ef8c47d396403d50eMichael Jurka exifData.setStripBytes(parser.getStripIndex(), buf); 83104c45677660586026a7e74ef8c47d396403d50eMichael Jurka } else { 84104c45677660586026a7e74ef8c47d396403d50eMichael Jurka Log.w(TAG, "Failed to read the strip bytes"); 85104c45677660586026a7e74ef8c47d396403d50eMichael Jurka } 86104c45677660586026a7e74ef8c47d396403d50eMichael Jurka break; 87104c45677660586026a7e74ef8c47d396403d50eMichael Jurka } 88104c45677660586026a7e74ef8c47d396403d50eMichael Jurka event = parser.next(); 89104c45677660586026a7e74ef8c47d396403d50eMichael Jurka } 90104c45677660586026a7e74ef8c47d396403d50eMichael Jurka return exifData; 91104c45677660586026a7e74ef8c47d396403d50eMichael Jurka } 92104c45677660586026a7e74ef8c47d396403d50eMichael Jurka} 93