| Home >> All >> com >> drew >> metadata >> [ exif Javadoc ] |
Source code: com/drew/metadata/exif/FujifilmMakernoteDescriptor.java
1 /* 2 * Created by dnoakes on 27-Nov-2002 10:12:05 using IntelliJ IDEA. 3 */ 4 package com.drew.metadata.exif; 5 6 import com.drew.lang.Rational; 7 import com.drew.metadata.Directory; 8 import com.drew.metadata.MetadataException; 9 import com.drew.metadata.TagDescriptor; 10 11 /** 12 * Fujifilm's digicam added the MakerNote tag from the Year2000's model (e.g.Finepix1400, 13 * Finepix4700). It uses IFD format and start from ASCII character 'FUJIFILM', and next 4 14 * bytes(value 0x000c) points the offset to first IFD entry. Example of actual data 15 * structure is shown below. 16 * 17 * :0000: 46 55 4A 49 46 49 4C 4D-0C 00 00 00 0F 00 00 00 :0000: FUJIFILM........ 18 * :0010: 07 00 04 00 00 00 30 31-33 30 00 10 02 00 08 00 :0010: ......0130...... 19 * 20 * There are two big differences to the other manufacturers. 21 * - Fujifilm's Exif data uses Motorola align, but MakerNote ignores it and uses Intel 22 * align. 23 * - The other manufacturer's MakerNote counts the "offset to data" from the first byte 24 * of TIFF header (same as the other IFD), but Fujifilm counts it from the first byte 25 * of MakerNote itself. 26 */ 27 public class FujifilmMakernoteDescriptor extends TagDescriptor 28 { 29 public FujifilmMakernoteDescriptor(Directory directory) 30 { 31 super(directory); 32 } 33 34 public String getDescription(int tagType) throws MetadataException 35 { 36 switch (tagType) { 37 case FujiFilmMakernoteDirectory.TAG_FUJIFILM_SHARPNESS: 38 return getSharpnessDescription(); 39 case FujiFilmMakernoteDirectory.TAG_FUJIFILM_WHITE_BALANCE: 40 return getWhiteBalanceDescription(); 41 case FujiFilmMakernoteDirectory.TAG_FUJIFILM_COLOR: 42 return getColorDescription(); 43 case FujiFilmMakernoteDirectory.TAG_FUJIFILM_TONE: 44 return getToneDescription(); 45 case FujiFilmMakernoteDirectory.TAG_FUJIFILM_FLASH_MODE: 46 return getFlashModeDescription(); 47 case FujiFilmMakernoteDirectory.TAG_FUJIFILM_FLASH_STRENGTH: 48 return getFlashStrengthDescription(); 49 case FujiFilmMakernoteDirectory.TAG_FUJIFILM_MACRO: 50 return getMacroDescription(); 51 case FujiFilmMakernoteDirectory.TAG_FUJIFILM_FOCUS_MODE: 52 return getFocusModeDescription(); 53 case FujiFilmMakernoteDirectory.TAG_FUJIFILM_SLOW_SYNCHRO: 54 return getSlowSyncDescription(); 55 case FujiFilmMakernoteDirectory.TAG_FUJIFILM_PICTURE_MODE: 56 return getPictureModeDescription(); 57 case FujiFilmMakernoteDirectory.TAG_FUJIFILM_CONTINUOUS_TAKING_OR_AUTO_BRACKETTING: 58 return getContinuousTakingOrAutoBrackettingDescription(); 59 case FujiFilmMakernoteDirectory.TAG_FUJIFILM_BLUR_WARNING: 60 return getBlurWarningDescription(); 61 case FujiFilmMakernoteDirectory.TAG_FUJIFILM_FOCUS_WARNING: 62 return getFocusWarningDescription(); 63 case FujiFilmMakernoteDirectory.TAG_FUJIFILM_AE_WARNING: 64 return getAutoExposureWarningDescription(); 65 default: 66 return _directory.getString(tagType); 67 } 68 } 69 70 private String getAutoExposureWarningDescription() throws MetadataException 71 { 72 if (!_directory.containsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_AE_WARNING)) return null; 73 int value = _directory.getInt(FujiFilmMakernoteDirectory.TAG_FUJIFILM_AE_WARNING); 74 switch (value) { 75 case 0: 76 return "AE good"; 77 case 1: 78 return "Over exposed (>1/1000s @ F11)"; 79 default: 80 return "Unknown (" + value + ")"; 81 } 82 } 83 84 private String getFocusWarningDescription() throws MetadataException 85 { 86 if (!_directory.containsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_FOCUS_WARNING)) return null; 87 int value = _directory.getInt(FujiFilmMakernoteDirectory.TAG_FUJIFILM_FOCUS_WARNING); 88 switch (value) { 89 case 0: 90 return "Auto focus good"; 91 case 1: 92 return "Out of focus"; 93 default: 94 return "Unknown (" + value + ")"; 95 } 96 } 97 98 private String getBlurWarningDescription() throws MetadataException 99 { 100 if (!_directory.containsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_BLUR_WARNING)) return null; 101 int value = _directory.getInt(FujiFilmMakernoteDirectory.TAG_FUJIFILM_BLUR_WARNING); 102 switch (value) { 103 case 0: 104 return "No blur warning"; 105 case 1: 106 return "Blur warning"; 107 default: 108 return "Unknown (" + value + ")"; 109 } 110 } 111 112 private String getContinuousTakingOrAutoBrackettingDescription() throws MetadataException 113 { 114 if (!_directory.containsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_CONTINUOUS_TAKING_OR_AUTO_BRACKETTING)) return null; 115 int value = _directory.getInt(FujiFilmMakernoteDirectory.TAG_FUJIFILM_CONTINUOUS_TAKING_OR_AUTO_BRACKETTING); 116 switch (value) { 117 case 0: 118 return "Off"; 119 case 1: 120 return "On"; 121 default: 122 return "Unknown (" + value + ")"; 123 } 124 } 125 126 private String getPictureModeDescription() throws MetadataException 127 { 128 if (!_directory.containsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_PICTURE_MODE)) return null; 129 int value = _directory.getInt(FujiFilmMakernoteDirectory.TAG_FUJIFILM_PICTURE_MODE); 130 switch (value) { 131 case 0: 132 return "Auto"; 133 case 1: 134 return "Portrait scene"; 135 case 2: 136 return "Landscape scene"; 137 case 4: 138 return "Sports scene"; 139 case 5: 140 return "Night scene"; 141 case 6: 142 return "Program AE"; 143 case 256: 144 return "Aperture priority AE"; 145 case 512: 146 return "Shutter priority AE"; 147 case 768: 148 return "Manual exposure"; 149 default: 150 return "Unknown (" + value + ")"; 151 } 152 } 153 154 private String getSlowSyncDescription() throws MetadataException 155 { 156 if (!_directory.containsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_SLOW_SYNCHRO)) return null; 157 int value = _directory.getInt(FujiFilmMakernoteDirectory.TAG_FUJIFILM_SLOW_SYNCHRO); 158 switch (value) { 159 case 0: 160 return "Off"; 161 case 1: 162 return "On"; 163 default: 164 return "Unknown (" + value + ")"; 165 } 166 } 167 168 private String getFocusModeDescription() throws MetadataException 169 { 170 if (!_directory.containsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_FOCUS_MODE)) return null; 171 int value = _directory.getInt(FujiFilmMakernoteDirectory.TAG_FUJIFILM_FOCUS_MODE); 172 switch (value) { 173 case 0: 174 return "Auto focus"; 175 case 1: 176 return "Manual focus"; 177 default: 178 return "Unknown (" + value + ")"; 179 } 180 } 181 182 private String getMacroDescription() throws MetadataException 183 { 184 if (!_directory.containsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_MACRO)) return null; 185 int value = _directory.getInt(FujiFilmMakernoteDirectory.TAG_FUJIFILM_MACRO); 186 switch (value) { 187 case 0: 188 return "Off"; 189 case 1: 190 return "On"; 191 default: 192 return "Unknown (" + value + ")"; 193 } 194 } 195 196 private String getFlashStrengthDescription() throws MetadataException 197 { 198 if (!_directory.containsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_FLASH_STRENGTH)) return null; 199 Rational value = _directory.getRational(FujiFilmMakernoteDirectory.TAG_FUJIFILM_FLASH_STRENGTH); 200 return value.toSimpleString(false) + " eV (Apex)"; 201 } 202 203 private String getFlashModeDescription() throws MetadataException 204 { 205 if (!_directory.containsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_FLASH_MODE)) return null; 206 int value = _directory.getInt(FujiFilmMakernoteDirectory.TAG_FUJIFILM_FLASH_MODE); 207 switch (value) { 208 case 0: 209 return "Auto"; 210 case 1: 211 return "On"; 212 case 2: 213 return "Off"; 214 case 3: 215 return "Red-eye reduction"; 216 default: 217 return "Unknown (" + value + ")"; 218 } 219 } 220 221 private String getToneDescription() throws MetadataException 222 { 223 if (!_directory.containsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_TONE)) return null; 224 int value = _directory.getInt(FujiFilmMakernoteDirectory.TAG_FUJIFILM_TONE); 225 switch (value) { 226 case 0: 227 return "Normal (STD)"; 228 case 256: 229 return "High (HARD)"; 230 case 512: 231 return "Low (ORG)"; 232 default: 233 return "Unknown (" + value + ")"; 234 } 235 } 236 237 private String getColorDescription() throws MetadataException 238 { 239 if (!_directory.containsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_COLOR)) return null; 240 int value = _directory.getInt(FujiFilmMakernoteDirectory.TAG_FUJIFILM_COLOR); 241 switch (value) { 242 case 0: 243 return "Normal (STD)"; 244 case 256: 245 return "High"; 246 case 512: 247 return "Low (ORG)"; 248 default: 249 return "Unknown (" + value + ")"; 250 } 251 } 252 253 private String getWhiteBalanceDescription() throws MetadataException 254 { 255 if (!_directory.containsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_WHITE_BALANCE)) return null; 256 int value = _directory.getInt(FujiFilmMakernoteDirectory.TAG_FUJIFILM_WHITE_BALANCE); 257 switch (value) { 258 case 0: 259 return "Auto"; 260 case 256: 261 return "Daylight"; 262 case 512: 263 return "Cloudy"; 264 case 768: 265 return "DaylightColor-fluorescence"; 266 case 769: 267 return "DaywhiteColor-fluorescence"; 268 case 770: 269 return "White-fluorescence"; 270 case 1024: 271 return "Incandenscense"; 272 case 3840: 273 return "Custom white balance"; 274 default: 275 return "Unknown (" + value + ")"; 276 } 277 } 278 279 private String getSharpnessDescription() throws MetadataException 280 { 281 if (!_directory.containsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_SHARPNESS)) return null; 282 int value = _directory.getInt(FujiFilmMakernoteDirectory.TAG_FUJIFILM_SHARPNESS); 283 switch (value) { 284 case 1: 285 case 2: 286 return "Soft"; 287 case 3: 288 return "Normal"; 289 case 4: 290 case 5: 291 return "Hard"; 292 default: 293 return "Unknown (" + value + ")"; 294 } 295 } 296 }