using System; using System.Collections; using System.Text; using System.IO; using com.drew.metadata; using com.drew.lang; /// /// This class was first written by Drew Noakes in Java. /// /// This is public domain software - that is, you can do whatever you want /// with it, and include it software that is licensed under the GNU or the /// BSD license, or whatever other licence you choose, including proprietary /// closed source licenses. I do ask that you leave this header in tact. /// /// If you make modifications to this code that you think would benefit the /// wider community, please send me a copy and I'll post it on my site. /// /// If you make use of this code, Drew Noakes will appreciate hearing /// about it: drew@drewnoakes.com /// /// Latest Java version of this software kept at /// http://drewnoakes.com/ /// /// The C# class was made by Ferret Renaud: /// renaud91@free.fr /// If you find a bug in the C# code, feel free to mail me. /// namespace com.drew.metadata.exif { /// /// Fujifilm's digicam added the MakerNote tag from the Year2000's model /// (e.g.Finepix1400, Finepix4700). It uses IFD format and start from ASCII character /// 'FUJIFILM', and next 4 bytes(aValue 0x000c) points the offSet to first IFD entry. /// Example of actual data structure is shown below. /// :0000: 46 55 4A 49 46 49 4C 4D-0C 00 00 00 0F 00 00 00 :0000: FUJIFILM........ /// :0010: 07 00 04 00 00 00 30 31-33 30 00 10 02 00 08 00 :0010: ......0130...... /// There are two big differences to the other manufacturers. /// - Fujifilm's Exif data uses Motorola align, but MakerNote ignores it and uses Intel align. /// - The other manufacturer's MakerNote counts the "offSet to data" from the first byte of /// TIFF header (same as the other IFD), but Fujifilm counts it from the first byte of MakerNote itself. /// public class FujifilmMakernoteDescriptor : TagDescriptor { /// /// Constructor of the object /// /// a directory public FujifilmMakernoteDescriptor(Directory directory) : base(directory) { } /// /// Returns a descriptive value of the the specified tag for this image. /// Where possible, known values will be substituted here in place of the raw tokens actually /// kept in the Exif segment. /// If no substitution is available, the value provided by GetString(int) will be returned. /// This and GetString(int) are the only 'get' methods that won't throw an exception. /// /// the tag to find a description for /// a description of the image's value for the specified tag, or null if the tag hasn't been defined. public override string GetDescription(int tagType) { switch(tagType) { case FujiFilmMakernoteDirectory.TAG_FUJIFILM_SHARPNESS : return GetSharpnessDescription(); case FujiFilmMakernoteDirectory.TAG_FUJIFILM_WHITE_BALANCE : return GetWhiteBalanceDescription(); case FujiFilmMakernoteDirectory.TAG_FUJIFILM_COLOR : return GetColorDescription(); case FujiFilmMakernoteDirectory.TAG_FUJIFILM_TONE : return GetToneDescription(); case FujiFilmMakernoteDirectory.TAG_FUJIFILM_FLASH_MODE : return GetFlashModeDescription(); case FujiFilmMakernoteDirectory.TAG_FUJIFILM_FLASH_STRENGTH : return GetFlashStrengthDescription(); case FujiFilmMakernoteDirectory.TAG_FUJIFILM_MACRO : return GetMacroDescription(); case FujiFilmMakernoteDirectory.TAG_FUJIFILM_FOCUS_MODE : return GetFocusModeDescription(); case FujiFilmMakernoteDirectory.TAG_FUJIFILM_SLOW_SYNCHRO : return GetSlowSyncDescription(); case FujiFilmMakernoteDirectory.TAG_FUJIFILM_PICTURE_MODE : return GetPictureModeDescription(); case FujiFilmMakernoteDirectory.TAG_FUJIFILM_CONTINUOUS_TAKING_OR_AUTO_BRACKETTING : return GetContinuousTakingOrAutoBrackettingDescription(); case FujiFilmMakernoteDirectory.TAG_FUJIFILM_BLUR_WARNING : return GetBlurWarningDescription(); case FujiFilmMakernoteDirectory.TAG_FUJIFILM_FOCUS_WARNING : return GetFocusWarningDescription(); case FujiFilmMakernoteDirectory.TAG_FUJIFILM_AE_WARNING : return GetAutoExposureWarningDescription(); default : return _directory.GetString(tagType); } } /// /// Returns the Auto Exposure Description. /// /// the Auto Exposure Description. private string GetAutoExposureWarningDescription() { if (!_directory .ContainsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_AE_WARNING)) return null; int aValue = _directory.GetInt( FujiFilmMakernoteDirectory.TAG_FUJIFILM_AE_WARNING); switch (aValue) { case 0 : return BUNDLE["AE_GOOD"]; case 1 : return BUNDLE["OVER_EXPOSED"]; default : return BUNDLE["UNKNOWN", aValue.ToString()]; } } /// /// Returns the Focus Warning Description. /// /// the Focus Warning Description. private string GetFocusWarningDescription() { if (!_directory .ContainsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_FOCUS_WARNING)) return null; int aValue = _directory.GetInt( FujiFilmMakernoteDirectory.TAG_FUJIFILM_FOCUS_WARNING); switch (aValue) { case 0 : return BUNDLE["AUTO_FOCUS_GOOD"]; case 1 : return BUNDLE["OUT_OF_FOCUS"]; default : return BUNDLE["UNKNOWN", aValue.ToString()]; } } /// /// Returns the Blur Warning Description. /// /// the Blur Warning Description. private string GetBlurWarningDescription() { if (!_directory .ContainsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_BLUR_WARNING)) return null; int aValue = _directory.GetInt( FujiFilmMakernoteDirectory.TAG_FUJIFILM_BLUR_WARNING); switch (aValue) { case 0 : return BUNDLE["NO_BLUR_WARNING"]; case 1 : return BUNDLE["BLUR_WARNING"]; default : return BUNDLE["UNKNOWN", aValue.ToString()]; } } /// /// Returns the Continuous Taking Or AutoBracketting Description. /// /// the Continuous Taking Or AutoBracketting Description. private string GetContinuousTakingOrAutoBrackettingDescription() { if (!_directory .ContainsTag( FujiFilmMakernoteDirectory .TAG_FUJIFILM_CONTINUOUS_TAKING_OR_AUTO_BRACKETTING)) return null; int aValue = _directory.GetInt( FujiFilmMakernoteDirectory .TAG_FUJIFILM_CONTINUOUS_TAKING_OR_AUTO_BRACKETTING); switch (aValue) { case 0 : return BUNDLE["OFF"]; case 1 : return BUNDLE["ON"]; default : return BUNDLE["UNKNOWN", aValue.ToString()]; } } /// /// Returns the Picture Mode Description. /// /// the Picture Mode Description. private string GetPictureModeDescription() { if (!_directory .ContainsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_PICTURE_MODE)) return null; int aValue = _directory.GetInt( FujiFilmMakernoteDirectory.TAG_FUJIFILM_PICTURE_MODE); switch (aValue) { case 0 : return BUNDLE["AUTO"]; case 1 : return BUNDLE["PORTRAIT_SCENE"]; case 2 : return BUNDLE["LANDSCAPE_SCENE"]; case 4 : return BUNDLE["SPORTS_SCENE"]; case 5 : return BUNDLE["NIGHT_SCENE"]; case 6 : return BUNDLE["PROGRAM_AE"]; case 256 : return BUNDLE["APERTURE_PRIORITY_AE"]; case 512 : return BUNDLE["SHUTTER_PRIORITY_AE"]; case 768 : return BUNDLE["MANUAL_EXPOSURE"]; default : return BUNDLE["UNKNOWN", aValue.ToString()]; } } /// /// Returns the Slow Sync Description. /// /// the Slow Sync Description. private string GetSlowSyncDescription() { if (!_directory .ContainsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_SLOW_SYNCHRO)) return null; int aValue = _directory.GetInt( FujiFilmMakernoteDirectory.TAG_FUJIFILM_SLOW_SYNCHRO); switch (aValue) { case 0 : return BUNDLE["OFF"]; case 1 : return BUNDLE["ON"]; default : return BUNDLE["UNKNOWN", aValue.ToString()]; } } /// /// Returns the Focus Mode Description. /// /// the Focus Mode Description. private string GetFocusModeDescription() { if (!_directory .ContainsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_FOCUS_MODE)) return null; int aValue = _directory.GetInt( FujiFilmMakernoteDirectory.TAG_FUJIFILM_FOCUS_MODE); switch (aValue) { case 0 : return BUNDLE["AUTO_FOCUS"]; case 1 : return BUNDLE["MANUAL_FOCUS"]; default : return BUNDLE["UNKNOWN", aValue.ToString()]; } } /// /// Returns the Macro Description. /// /// the Macro Description. private string GetMacroDescription() { if (!_directory .ContainsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_MACRO)) return null; int aValue = _directory.GetInt(FujiFilmMakernoteDirectory.TAG_FUJIFILM_MACRO); switch (aValue) { case 0 : return BUNDLE["OFF"]; case 1 : return BUNDLE["ON"]; default : return BUNDLE["UNKNOWN", aValue.ToString()]; } } /// /// Returns the Flash Strength Description. /// /// the Flash Strength Description. private string GetFlashStrengthDescription() { if (!_directory .ContainsTag( FujiFilmMakernoteDirectory.TAG_FUJIFILM_FLASH_STRENGTH)) return null; Rational aValue = _directory.GetRational( FujiFilmMakernoteDirectory.TAG_FUJIFILM_FLASH_STRENGTH); return BUNDLE["FLASH_STRENGTH", aValue.ToSimpleString(false)]; } /// /// Returns the Flash Mode Description. /// /// the Flash Mode Description. private string GetFlashModeDescription() { if (!_directory .ContainsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_FLASH_MODE)) return null; int aValue = _directory.GetInt( FujiFilmMakernoteDirectory.TAG_FUJIFILM_FLASH_MODE); switch (aValue) { case 0 : return BUNDLE["AUTO"]; case 1 : return BUNDLE["ON"]; case 2 : return BUNDLE["OFF"]; case 3 : return BUNDLE["RED_YEY_REDUCTION"]; default : return BUNDLE["UNKNOWN", aValue.ToString()]; } } /// /// Returns the Tone Description. /// /// the Tone Description. private string GetToneDescription() { if (!_directory .ContainsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_TONE)) return null; int aValue = _directory.GetInt(FujiFilmMakernoteDirectory.TAG_FUJIFILM_TONE); switch (aValue) { case 0 : return BUNDLE["NORMAL_STD"]; case 256 : return BUNDLE["HIGH_HARD"]; case 512 : return BUNDLE["LOW_ORG"]; default : return BUNDLE["UNKNOWN", aValue.ToString()]; } } /// /// Returns the Color Description. /// /// the Color Description. private string GetColorDescription() { if (!_directory .ContainsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_COLOR)) return null; int aValue = _directory.GetInt(FujiFilmMakernoteDirectory.TAG_FUJIFILM_COLOR); switch (aValue) { case 0 : return BUNDLE["NORMAL_STD"]; case 256 : return BUNDLE["HIGH"]; case 512 : return BUNDLE["LOW_ORG"]; default : return BUNDLE["UNKNOWN", aValue.ToString()]; } } /// /// Returns the White Balance Description. /// /// the White Balance Description. private string GetWhiteBalanceDescription() { if (!_directory .ContainsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_WHITE_BALANCE)) return null; int aValue = _directory.GetInt( FujiFilmMakernoteDirectory.TAG_FUJIFILM_WHITE_BALANCE); switch (aValue) { case 0 : return BUNDLE["AUTO"]; case 256 : return BUNDLE["DAYLIGHT"]; case 512 : return BUNDLE["CLOUDY"]; case 768 : return BUNDLE["DAYLIGHTCOLOR_FLUORESCENCE"]; case 769 : return BUNDLE["DAYWHITECOLOR_FLUORESCENCE"]; case 770 : return BUNDLE["WHITE_FLUORESCENCE"]; case 1024 : return BUNDLE["INCANDENSCENSE"]; case 3840 : return BUNDLE["CUSTOM_WHITE_BALANCE"]; default : return BUNDLE["UNKNOWN", aValue.ToString()]; } } /// /// Returns the Sharpness Description. /// /// the Sharpness Description. private string GetSharpnessDescription() { if (!_directory .ContainsTag(FujiFilmMakernoteDirectory.TAG_FUJIFILM_SHARPNESS)) return null; int aValue = _directory.GetInt( FujiFilmMakernoteDirectory.TAG_FUJIFILM_SHARPNESS); switch (aValue) { case 1 : case 2 : return BUNDLE["SOFT"]; case 3 : return BUNDLE["NORMAL"]; case 4 : case 5 : return BUNDLE["HARD"]; default : return BUNDLE["UNKNOWN", aValue.ToString()]; } } } }