diff --git a/components/fpexif/examples/metadata_viewer/MetadataViewer.lpi b/components/fpexif/examples/metadata_viewer/MetadataViewer.lpi index 62a37814a..e6dc4fe9d 100644 --- a/components/fpexif/examples/metadata_viewer/MetadataViewer.lpi +++ b/components/fpexif/examples/metadata_viewer/MetadataViewer.lpi @@ -47,7 +47,6 @@ - @@ -65,11 +64,6 @@ - - - - - diff --git a/components/fpexif/examples/metadata_viewer/mdvmain.pas b/components/fpexif/examples/metadata_viewer/mdvmain.pas index dbe9705e9..b1e0742a7 100644 --- a/components/fpexif/examples/metadata_viewer/mdvmain.pas +++ b/components/fpexif/examples/metadata_viewer/mdvmain.pas @@ -195,7 +195,6 @@ begin for i := 0 to FImgInfo.ExifData.TagCount-1 do begin lTag := FImgInfo.ExifData.TagByIndex[i]; - if lTag is TMakerNoteStringTag then suffix := ':' + IntToStr(TMakerNoteStringTag(lTag).Index) else if lTag is TMakerNoteIntegerTag then @@ -205,7 +204,6 @@ begin else suffix := ''; - if lTag is TVersionTag then TVersionTag(lTag).Separator := '.'; item := TagListView.Items.Add; diff --git a/components/fpexif/fpeexifdata.pas b/components/fpexif/fpeexifdata.pas index dafc11ac2..c209ba0f7 100644 --- a/components/fpexif/fpeexifdata.pas +++ b/components/fpexif/fpeexifdata.pas @@ -337,6 +337,7 @@ begin AddUShortTag (P+$012D, 'TransferFunction', 768, rsTransferFunction); AddStringTag (P+$0131, 'Software', 1, rsSoftware); AddStringTag (P+$0132, 'DateTime', 1, rsDateTime, '', TDateTimeTag); + AddStringTag (T+$0132, 'DateTime', 1, rsDateTime, '', TDateTimeTag); AddStringTag (P+$013B, 'Artist', 1, rsArtist); AddStringTag (P+$013C, 'HostComputer', 1, rsHostComputer); AddUShortTag (P+$013D, 'Predictor', 1, rsPredictor, rsPredictorLkup); @@ -623,9 +624,14 @@ begin break; // Find definition of the sub-ifd tag parentTagDef := FindExifTagDefWithoutParent(parentID); - // ... create tag for it + // ... Could not be found, tag not defined. We cannot handle this case. + if parentTagDef = nil then begin + ATag.Free; + Result := -1; // This will signal the calling procedure to destroy ATag. + exit; + end; + // ... create tag for it and add it to the list. parentTag := TSubIFDTag.Create(parentTagDef, FBigEndian); - // ... and add it to the list (recursively, i.e. it will check for parents again) AddOrReplaceTag(parentTag); until false; end; diff --git a/components/fpexif/fpemakernote.pas b/components/fpexif/fpemakernote.pas index 168dbe0b9..b25c805ca 100644 --- a/components/fpexif/fpemakernote.pas +++ b/components/fpexif/fpemakernote.pas @@ -1,3 +1,6 @@ +{ Add this unit to the "uses" clause of the main form in order be able to + read the MakerNote tag of all supported camera makes. } + unit fpeMakerNote; interface diff --git a/components/fpexif/fpemakernotenikon.pas b/components/fpexif/fpemakernotenikon.pas index 3b8d12f4b..8aef61db7 100644 --- a/components/fpexif/fpemakernotenikon.pas +++ b/components/fpexif/fpemakernotenikon.pas @@ -257,12 +257,6 @@ end; function TNikonMakerNoteReader.AddTag(AStream: TStream; const AIFDRecord: TIFDRecord; const AData: TBytes; AParent: TTagID): Integer; -type - TVRInfoRecord = record - Version: DWord; - VibrationReduction: byte; - VRMode: byte; - end; var tagDef: TTagDef; p: PByte; diff --git a/components/fpexif/fpemakernoteolympus.pas b/components/fpexif/fpemakernoteolympus.pas index 790afa5cf..4e92ad71a 100644 --- a/components/fpexif/fpemakernoteolympus.pas +++ b/components/fpexif/fpemakernoteolympus.pas @@ -9,13 +9,25 @@ uses fpeGlobal, fpeTags, fpeExifReadWrite; type + + { TOlympusMakerNoteReader } + TOlympusMakerNoteReader = class(TMakerNoteReader) + private protected FVersion: Integer; + function AddTag(AStream: TStream; const AIFDRecord: TIFDRecord; + const AData: TBytes; AParent: TTagID): Integer; override; procedure GetTagDefs({%H-}AStream: TStream); override; function Prepare(AStream: TStream): Boolean; override; end; + TOlympusFlashModeTag = class(TIntegerTag) + public + function GetAsString: String; override; + end; + + implementation uses @@ -23,19 +35,132 @@ uses resourcestring // Olympus + rsOlympusAELock = 'Auto-exposure lock'; + rsOlympusAFSearch = 'AF search'; + rsOlympusAFSearchLkUp = '0:Not ready,1:Ready'; + rsOlympusAFAreas = 'AF areas'; + rsOlympusAFFineTune = 'AF fine tune'; + rsOlympusAFFineTuneAdj = 'AF fine tune adj'; + rsOlympusAFPointSelected = 'AF point selected'; + rsOlympusArtFilter = 'Art filter'; + rsOlympusArtFilterLkUp = '0:Off,1:Soft Focus,2:Pop Art,3:Pale & Light Color,'+ + '4:Light Tone,5:Pin Hole,6:Grainy Film,9:Diorama,10:Cross Process,12:Fish Eye,'+ + '13:Drawing,14:Gentle Sepia,15:Pale & Light Color II,16:Pop Art II,'+ + '17:Pin Hole II,18:Pin Hole III,19:Grainy Film II,20:Dramatic Tone,21:Punk,'+ + '22:Soft Focus 2,23:Sparkle,24:Watercolor,25:Key Line,26:Key Line II,27:Miniature,'+ + '28:Reflection,29:Fragmented,31:Cross Process II,32:Dramatic Tone II,'+ + '33:Watercolor I,34:Watercolor II,35:Diorama II,36:Vintage,37:Vintage II,'+ + '38:Vintage III,39:Partial Color,40:Partial Color II,41:Partial Color III'; + rsOlympusArtFilterEffect = 'ArtFilterEffect'; + rsOlympusArtFilterEffect0LkUp = '0:Off,1:Soft Focus,2:Pop Art,'+ + '3:Pale & Light Color,4:Light Tone,5:Pin Hole,6:Grainy Film,9:Diorama,'+ + '10:Cross Process,$c:Fish Eye,$d:Drawing,$e:Gentle Sepia,$f:Pale & Light Color II,'+ + '$10:Pop Art II,$11:Pin Hole II,$12:Pin Hole III,$13:Grainy Film II,'+ + '$14:Dramatic Tone,$15:Punk,$16:Soft Focus 2,$17:Sparkle,$18: Watercolor,'+ + '$19:Key Line,$1a:Key Line II,$1b:Miniature,$1c:Reflection,$1d:Fragmented,'+ + '$1f:Cross Process II,$20:Dramatic Tone II,$21:Watercolor I,$22:Watercolor II,'+ + '$23:Diorama II,$24:Vintage,$25:Vintage II,$26:Vintage III,$27:Partial Color,'+ + '$28:Partial Color II,$29:Partial Color III'; + rsOlympusArtFilterEffect4LkUp = '$0000:No Effect,$8010:Star Light,'+ + '$8020:Pin Hole,$8030:Frame,$8040:Soft Focus,$8050:White Edge,$8060 = B&W,'+ + '$8080:Blur Top and Bottom,$8081:Blur Left and Right'; + rsOlympusArtFiltereffect6LkUp = '0:No color filter,1:Yellow color filter,'+ + '2:Orange color filter,3:Red color rilter,4:Green color filter'; + rsOlympusExposureShift= 'Exposure shift'; rsOlympusCCDScanModeLkup = '0:Interlaced,1:Progressive'; + rsOlympusColorCreatorEffect = 'Color creator effect'; + rsOlympusColorProfileSettings = 'Color profile settings'; + rsOlympusColorSpace = 'Color space'; + rsOlympusColorSpaceLkUp = '0:sRGB,1:Adobe RGB,2:Pro Photo RGB'; + rsOlympusCompressionFactor = 'Compression factor'; rsOlympusContrastLkup = '0:High,1:Normal,2:Low'; + rsOlympusContrastSetting = 'Contrast setting (value, min, max)'; + rsOlympusCustomSaturation = 'Custom saturation'; + rsOlympusDistortionCorrection = 'Distortion correction'; + rsOlympusDriveMode = 'Drive mode'; + rsOlympusExposureMode = 'Exposure mode'; + rsOlympusExposureModeLkUp = '1:Manual,2:Program,3:Aperture-priority AE,'+ + '4:Shutter speed priority AE,5:Program-shift'; + rsOlympusExtendedWBDetect = 'Extended WB detect'; + rsOlympusFilmGrainEffect = 'Film grain effect'; + rsOlympusFilmGrainEffectLkUp = '0:Off,1:Low,2:Medium,3:High'; + rsOlympusFlashControlMode = 'Flash control mode'; + rsOlympusFlashControlModeLkUp = '0:Off,3:TTL,4:Auto,5:Manual'; rsOlympusFlashDevLkup = '0:None,1:Internal,4:External,5:Internal + External'; + rsOlympusFlashExposureComp = 'Flash exposure comp'; + rsOlympusFlashIntensity = 'Flash intensity'; + rsOlympusFlashMode = 'Flash mode'; rsOlympusFlashModeLkup = '2:On,3;Off'; rsOlympusFlashModelLkup = '0:None,1:FL-20,2:FL-50,3:RF-11,4:TF-22,5:FL-36,'+ '6:FL-50R,7:FL-36R,9:FL-14,11:FL-600R'; + rsOlympusFlashRemoteControl = 'Flash remote control'; + rsOlympusFlashRemoteControlLkUp = '0:Off,1:Channel 1 Low,2:Channel 2 Low,'+ + '3:Channel 3 Low,4:Channel 4 Low,9:Channel 1 Mid,$A:Channel 2 Mid,'+ + '$B:Channel 3 Mid,$C:Channel 4 Mid,$11:Channel 1 High,'+ + '$12:Channel 2 High,$13:Channel 3 High,$14:Channel 4 High'; rsOlympusFlashTypeLkup = '0:None,2:Simple E-System,3:E-System'; + rsOlympusFocusMode = 'Focus mode'; + rsOlympusFocusModeLkUp0 = '0:Single AF,1:Sequential shooting AF,'+ + '2:Continuous AF,3:Multi AF,4:Face detect,10:MF'; + rsOlympusFocusProcess = 'Focus process'; + rsOlympusFocusProcessLkUp0 = '0:AF not used,1:AF used'; + rsOlympusGradation = 'Gradation'; + rsOlympusImageQuality = 'Image quality'; + rsOlympusImageQualityLkUp = '1:SQ,2:HQ,3:SHQ,4:RAW,5:SQ (5)'; + rsOlympusImageStabilization = 'Image stabilization'; + rsOlympusImageStabilizationLkUp = '0:Off,1:On (Mode 1),2:On (Mode 2),'+ + '3:On (Mode 3),4:On (Mode 4)'; rsOlympusJpegQualLkup = '1:SQ,2:HQ,3:SHQ,4:Raw'; rsOlympusMacroLkup = '0:Off,1:On,2:Super Macro'; + rsOlympusMacroMode = 'Macro mode'; + rsOlympusMacroModeLkUp = '0:Off,1:On,2:Super Macro'; + rsOlympusMagicFilter = 'Magic filter'; + rsOlympusMagicFilterLkUp = '0:Off,1:Soft Focus,2:Pop Art,3:Pale & Light Color,'+ + '4:Light Tone,5:Pin Hole,6:Grainy Film,9:Diorama,10:Cross Process,12:Fish Eye,'+ + '13:Drawing,14:Gentle Sepia,15:Pale & Light Color II,16:Pop Art II,'+ + '17:Pin Hole II,18:Pin Hole III,19:Grainy Film II,20:Dramatic Tone,21:Punk,'+ + '22:Soft Focus 2,23:Sparkle,24:Watercolor,25:Key Line,26:Key Line II,'+ + '27:Miniature,28:Reflection,29:Fragmented,31:Cross Process II,'+ + '32:Dramatic Tone II,33:Watercolor I,34:Watercolor II,35:Diorama II,'+ + '36:Vintage,37:Vintage II,38:Vintage III,39:Partial Color,40:Partial Color II,'+ + '41:Partial Color III'; + rsOlympusManometerPressure = 'Manometer pressure'; + rsOlympusManometerReading = 'Manometer reading'; + rsOlympusManualFlashStrength = 'Manual flash strength'; + rsOlympusMeteringModeLkUp = '2:Center-weighted average,3:Spot,5:ESP,'+ + '261:Pattern+AF,515:Spot+Highlight control,1027:Spot+Shadow control'; + rsOlympusModifiedSaturation = 'Modified saturation'; + rsOlympusModifiedSaturationLkUp = '0:Off,1:CM1 (Red Enhance),2:CM2 (Green Enhance),'+ + '3:CM3 (Blue Enhance),4:CM4 (Skin Tones)'; + rsOlympusMonochromeColor = 'Monochrome color'; + rsOlympusMonochromeColorLkUp = '0:(none),1:Normal,2:Sepia,3:Blue,4:Purple,5:Green'; + rsOlympusMonochromeProfileSettings = 'Monochrome profile settings'; + rsOlympusMonochromeProfileSettingsLkUp = '0:No filter,1:Yellow filter,'+ + '2:Orange filter,3:Red filter,4:Magenta filter,5:Blue filter,'+ + '6:Cyan filter,7:Green filter,8:Yellow-green filter'; + rsOlympusMonochromeVignetting = 'Monochrome vignetting'; + rsOlympusNoiseFilter = 'Noise filter'; + rsOlympusNoiseReduction = 'Noise reduction'; + rsOlympusPanoramaMode = 'Panorama mode'; + rsOlympusPictureMode = 'Picture mode'; + rsOlympusPictureModeLkUp = '1:Vivid,2:Natural,3:Muted,4:Portrait,5:i-Enhance,'+ + '6:e-Portrait,7:Color Creator,9:Color Profile 1,10:Color Profile 2,'+ + '11:Color Profile 3,12:Monochrome Profile 1,13:Monochrome Profile 2,'+ + '14:Monochrome Profile 3,256:Monotone,512:Sepia'; + rsOlympusPictureModeBWFilter = 'Picture mode BW filter'; + rsOlympusPictureModeBWFilterLkUp = '0:n/a,1:Neutral,2:Yellow,3:Orange,4:Red,5:Green'; + rsOlympusPictureModeContrast = 'Picture mode contrast (value, min, max)'; + rsOlympusPictureModeEffect = 'Picture mode effect'; + rsOlympusPictureModeHue = 'Picture mode hue'; + rsOlympusPictureModeSaturation = 'Picture mode saturation (value, min, max)'; + rsOlympusPictureModeSharpness = 'Picture mode sharpness (value, min, max)'; + rsOlympusPictureModeTone = 'Picture mode tone'; + rsOlympusPictureModeToneLkUp = '0:n/a,1:Neutral,2:Sepia,3:Blue,4:Purple,5:Green'; rsOlympusPreviewImgLength = 'Preview image length'; rsOlympusPreviewImgStart = 'Preview image start'; rsOlympusPreviewImgValid = 'Preview image valid'; rsOlympusSharpnessLkup = '0:Normal,1:Hard,2:Soft'; + rsOlympusSceneMode = 'Scene mode'; rsOlympusSceneModeLkup = '0:Normal,1:Standard,2:Auto,3:Intelligent Auto,' + '4:Portrait,5:Landscape+Portrait,6:Landscape,7:Night Scene,8:Night+Portrait' + '9:Sport,10:Self Portrait,11:Indoor,12:Beach & Snow,13:Beach,14:Snow,' + @@ -45,13 +170,40 @@ resourcestring '30:Underwater Wide2,31:Digital Image Stabilization,32:Face Portrait,33:Pet,'+ '34:Smile Shot,35:Quick Shutter,43:Hand-held Starlight,100:Panorama,'+ '101:Magic Filter,103:HDR'; + rsOlympusSceneModeLkUp2 = '0:Standard,6:Auto,7:Sport,8:Portrait,9:Landscape+Portrait,'+ + '10:Landscape,11:Night Scene,12:Self Portrait,13:Panorama,14:2 in 1,'+ + '15:Movie,16:Landscape+Portrait,17:Night+Portrait,18:Indoor,19:Fireworks,'+ + '20:Sunset,21:Beauty Skin,22:Macro,23:Super Macro,24:Food,25:Documents,'+ + '26:Museum,27:Shoot & Select,28:Beach & Snow,29:Self Protrait+Timer,'+ + '30:Candle,31:Available Light,32:Behind Glass,33:My Mode,34:Pet.35:Underwater Wide1,'+ + '36:Underwater Macro,37:Shoot & Select1,38:Shoot & Select2,39:High Key,'+ + '40:Digital Image Stabilization,41:Auction,42:Beach,43:Snow,44:Underwater Wide2,'+ + '45:Low Key,46:Children,47:Vivid,48:Nature Macro,49:Underwater Snapshot,'+ + '50:Shooting Guide,54:Face Portrait,57:Bulb,59:Smile Shot,60:Quick Shutter,'+ + '63:Slow Shutter,64:Bird Watching,65:Multiple Exposure,66:e-Portrait,'+ + '67:Soft Background Shot,142:Hand-held Starlight,154:HDR'; + rsOlympusShadingCompression = 'Shading compression'; + rsOlympusSharpnessSetting = 'Sharpness setting (value, min, max)'; + rsOlympusStackedImage = 'Stacked image'; + rsOlympusToneLevel = 'Tone level'; + rsOlympusWhiteBalance = 'White balance'; + rsOlympusWhiteBalance2LkUp = '0:Auto,1:Auto (Keep Warm Color Off),'+ + '16:7500K (Fine Weather with Shade),17:6000K (Cloudy),18:5300K (Fine Weather),'+ + '20:3000K (Tungsten light),21:3600K (Tungsten light-like),22:Auto Setup,'+ + '23:5500K (Flash),33:6600K (Daylight fluorescent),'+ + '34:4500K (Neutral white fluorescent),35:4000K (Cool white fluorescent),'+ + '36:White Fluorescent,48:3600K (Tungsten light-like),67:Underwater,'+ + '256:One Touch WB 1,257:One Touch WB 2,258:One Touch WB 3,259:One Touch WB 4,'+ + '512:Custom WB 1,513:Custom WB 2,514:Custom WB 3,515:Custom WB 4'; + rsOlympusWhiteBalanceBracket = 'White balance bracket'; + rsOlympusWhiteBalanceTemperature = 'White balance temperature'; // Most from https://sno.phy.queensu.ca/~phil/exiftool/TagNames/Olympus.html // some from dExif const E = $2010 shl 16; // Equipment version - C = $2011 shl 16; // Camera settings + C = $2020 shl 16; // Camera settings procedure BuildOlympusTagDefs(AList: TTagDefList); const @@ -134,7 +286,7 @@ begin AddSRationalTag(M+$103D, 'LightValueCenter'); AddSRationalTag(M+$103E, 'LightValuePeriphery'); AddIFDTag (M+$2010, 'Equipment', '', TSubIFDTag); - AddIFDTag (M+$2011, 'CameraSettings', '', TSubIFDTag); + AddIFDTag (M+$2020, 'CameraSettings', '', TSubIFDTag); // Olympus Equipment Tags AddBinaryTag (E+$0000, 'EquipmentVersion', 4, '', '', '', TVersionTag); @@ -168,7 +320,68 @@ begin AddULongTag (C+$0100, 'PreviewImageValid', 1, rsOlympusPreviewImgValid, rsOffOn); AddULongTag (C+$0101, 'PreviewImageStart', 1, rsOlympusPreviewImgStart); AddULongTag (C+$0102, 'PreviewImageLength', 1, rsOlympusPreviewImgLength); - + AddUShortTag (C+$0200, 'ExposureMode', 1, rsOlympusExposureMode, rsOlympusExposureModeLkUp); + AddUShortTag (C+$0201, 'AELock', 1, rsOlympusAELock, rsOffOn); + AddUShortTag (C+$0202, 'MeteringMode', 1, '', rsOlympusMeteringModeLkUp); + AddSRationalTag(C+$0203, 'ExposureShift', 1, rsOlympusExposureShift); + AddUShortTag (C+$0204, 'NDFilter', 1, '', rsOffOn); + AddUShortTag (C+$0300, 'MacroMode', 1, rsOlympusMacroMode, rsOlympusMacroModeLkUp); + AddUShortTag (C+$0301, 'FocusMode', 2, rsOlympusFocusMode, rsOlympusFocusModeLkUp0); + AddUShortTag (C+$0302, 'FocusProcess', 2, rsOlympusFocusProcess, rsOlympusFocusProcessLkUp0); + AddUShortTag (C+$0303, 'AFSearch', 1, rsOlympusAFSearch, rsOlympusAFSearchLkUp); + AddULongTag (C+$0304, 'AFAreas', 64, rsOlympusAFAreas); + AddSRationalTag(C+$0305, 'AFPointSelected', 5, rsOlympusAFPointSelected); + AddByteTag (C+$0306, 'AFFineTune', 1, rsOlympusAFFineTune, rsOffOn); + AddSShortTag (C+$0307, 'AFFineTuneAdj', 3, rsOlympusAFFineTuneAdj); + AddUShortTag (C+$0400, 'FlashMode', 1, rsOlympusFlashMode, '', '', TOlympusFlashModeTag); + AddSRationalTag(C+$0401, 'FlashExposureComp', 1, rsOlympusFlashExposureComp); + AddULongTag (C+$0403, 'FlashRemoteControl', 1, rsOlympusFlashRemoteControl, rsOlympusFlashRemoteControlLkUp); + AddULongTag (C+$0404, 'FlashControlMode', 4, rsOlympusFlashControlMode, rsOlympusFlashControlModeLkUp); + AddSRationalTag(C+$0405, 'FlashIntensity', 4, rsOlympusFlashIntensity); + AddSRationalTag(C+$0406, 'ManualFlashStrength', 4, rsOlympusManualFlashStrength); + AddSShortTag (C+$0500, 'WhiteBalance2', 1, rsOlympusWhiteBalance, rsOlympusWhiteBalance2LkUp); + AddUShortTag (C+$0501, 'WhiteBalanceTemperature', 1, rsOlympusWhiteBalanceTemperature); + AddSShortTag (C+$0502, 'WhiteBalanceBracket', 1, rsOlympusWhiteBalanceBracket); + AddUShortTag (C+$0503, 'CustomSaturation', 3, rsOlympusCustomSaturation); + AddUShortTag (C+$0504, 'ModifiedSaturation', 1, rsOlympusModifiedSaturation, rsOlympusModifiedSaturationLkUp); + AddSShortTag (C+$0505, 'ContrastSetting', 3, rsOlympusContrastSetting); + AddSShortTag (C+$0506, 'SharpnessSetting', 3, rsOlympusSharpnessSetting); + AddUShortTag (C+$0507, 'ColorSpace', 1, rsOlympusColorSpace, rsOlympusColorSpaceLkUp); + AddUShortTag (C+$0509, 'SceneMode', 1, rsOlympusSceneMode, rsOlympusSceneModeLkUp2); + AddUShortTag (C+$050A, 'NoiseReduction', 1, rsOlympusNoiseReduction); + AddUShortTag (C+$050B, 'DistortionCorrection', 1, rsOlympusDistortionCorrection, rsOffOn); + AddUShortTag (C+$050C, 'ShadingCompression', 1, rsOlympusShadingCompression, rsOffOn); + AddURationalTag(C+$050D, 'CompressionFactor', 1, rsOlympusCompressionFactor); + AddSShortTag (C+$050F, 'Gradation', 1, rsOlympusGradation); + AddUShortTag (C+$0520, 'PictureMode', 2, rsOlympusPictureMode, rsOlympusPictureModeLkUp); + AddSShortTag (C+$0521, 'PictureModeSaturation', 3, rsOlympusPictureModeSaturation); + AddSShortTag (C+$0522, 'PictureModeHue', 1, rsOlympusPictureModeHue); + AddSShortTag (C+$0523, 'PictureModeContrast', 3, rsOlympusPictureModeContrast); + AddSShortTag (C+$0524, 'PictureModeSharpness', 3, rsOlympusPictureModeSharpness); + AddSShortTag (C+$0525, 'PictureModeBWFilter', 1, rsOlympusPictureModeBWFilter, rsOlympusPictureModeBWFilterLkUp); + AddSShortTag (C+$0526, 'PictureModeTone', 1, rsOlympusPictureModeTone, rsOlympusPictureModeToneLkUp); + AddSShortTag (C+$0527, 'NoiseFilter', 3, rsOlympusNoiseFilter); + AddUShortTag (C+$0529, 'ArtFilter', 4, rsOlympusArtFilter, rsOlympusArtFilterLkUp); + AddUShortTag (C+$052C, 'MagicFilter', 4, rsOlympusMagicFilter, rsOlympusMagicFilterLkUp); + AddSShortTag (C+$052D, 'PictureModeEffect', 3, rsOlympusPictureModeEffect); + AddSShortTag (C+$052E, 'ToneLevel', 1, rsOlympusToneLevel); + AddSShortTag (C+$0532, 'ColorCreatorEffect', 6, rsOlympusColorCreatorEffect); + AddSShortTag (C+$0537, 'MonochromeProfileSettings', 6, rsOlympusMonochromeProfileSettings, rsOlympusMonochromeProfileSettingsLkUp); + AddSShortTag (C+$0538, 'FilmGrainEffect', 1, rsOlympusFilmGrainEffect, rsOlympusFilmGrainEffectLkUp); + AddSShortTag (C+$0539, 'ColorProfileSettings', 14, rsOlympusColorProfileSettings); + AddSShortTag (C+$053A, 'MonochromeVignetting', 1, rsOlympusMonochromeVignetting); + AddSShortTag (C+$053B, 'MonochromeColor', 1, rsOlympusMonochromeColor, rsOlympusMonochromeColorLkUp); + AddUShortTag (C+$0600, 'DriveMode', 5, rsOlympusDriveMode); + AddUShortTag (C+$0601, 'PanoramaMode', 2, rsOlympusPanoramaMode); + AddUShortTag (C+$0603, 'ImageQuality', 1, rsOlympusImageQuality, rsOlympusImageQualityLkUp); + AddULongTag (C+$0604, 'ImageStabilization', 1, rsOlympusImageStabilization, rsOlympusImageStabilizationLkUp); + AddULongTag (C+$0804, 'StackedImage', 2, rsOlympusStackedImage); + AddUShortTag (C+$0900, 'ManometerPressure', 1, rsOlympusManometerPressure); + AddSLongTag (C+$0901, 'ManometerReading', 2, rsOlympusManometerReading); + AddUShortTag (C+$0902, 'ExtendedWBDetect', 1, rsOlympusExtendedWBDetect, rsOffOn); + AddSShortTag (C+$0903, 'RollAngle', 2); + AddSShortTag (C+$0904, 'PitchAngle', 2); + AddStringTag (C+$0908, 'DateTimeUTC'); end; end; @@ -177,19 +390,65 @@ end; // TOlympusMakerNoteReader //============================================================================== +function TOlympusMakerNoteReader.AddTag(AStream: TStream; + const AIFDRecord: TIFDRecord; const AData: TBytes; AParent: TTagID): Integer; +var + tagDef: TTagDef; + p: PByte; + t: TTagID; + w: Word; +begin + Result := -1; + + tagDef := FindTagDef(AIFDRecord.TagID or AParent); + if (tagDef = nil) then + exit; + + Result := inherited AddTag(AStream, AIFDRecord, AData, AParent); + t := tagDef.TagID; + case tagDef.TagID of + C+$052F: // Camera settings / Art filter effect + if Length(AData) > 7*2 then + with FImgInfo.ExifData do begin + w := FixEndian16(PWord(@AData[0])^); + AddMakerNoteTag(0, t, rsOlympusArtFilterEffect, w, rsOlympusArtFilterEffect0LkUp); + w := FixEndian16(PWord(@AData[4*2])^); + AddMakerNoteTag(4, t, rsOlympusArtFilterEffect, w, rsOlympusArtFilterEffect4LkUp); + w := FixEndian16(PWord(@AData[6*2])^); + AddMakerNoteTag(6, t, rsOlympusArtFilterEffect, w, rsOlympusArtFilterEffect6LkUp); + end; + { + C+$0301: // Camera settings / Focus mode + with FImgInfo.ExifData do begin + w := FixEndian16(PWord(@AData[0])^); + AddMakerNoteTag(0, t, rsOlympusFocusModeAF, w, rsOlympusFocusModeAFLkUp); + // to do: decode 2nd field which is a bit field + end; + } + { + C+$0302: // Camera settings / Focus process + with FImgInfo.ExifData do begin + w := FixEndian16(PWord(@AData[0])^); + AddMakerNoteTag(0, t, rsOlympusFocusProcessAF, w, rsOlympusFocusProcessAFLkUp); + end; + } + + end; +end; + procedure TOlympusMakerNoteReader.GetTagDefs(AStream: TStream); const SIGNATURE_V1 = 'OLYMP'#00#01#00; SIGNATURE_V2 = 'OLYMP'#00#02#00; - SIGNATURE_V3I = 'OLYMPUS'#00'II'#3; - SIGNATURE_V3M = 'OLYMPUS'#00'MM'#3; + SIGNATURE_V3I = 'OLYMPUS'#00'II'#03#00; + SIGNATURE_V3M = 'OLYMPUS'#00'MM'#03#00; var hdr: array of byte; p: Int64; begin p := AStream.Position; - SetLength(hdr, 11); - AStream.Read(hdr[0], 11); + SetLength(hdr, 12); + AStream.Read(hdr[0], 12); AStream.Position := p; if (PosInBytes(SIGNATURE_V1, hdr) <> 0) and @@ -251,11 +510,44 @@ begin else exit; end; - BuildOlympusTagDefs(FTagDefs); Result := true; end; +//============================================================================== +// Special Olympus tags +//============================================================================== + +function TOlympusFlashModeTag.GetAsString: String; +var + intVal: Integer; +begin + if (toDecodeValue in FOptions) then begin + intVal := AsInteger; + if intVal = 0 then + Result := 'Off' + else begin + Result := ''; + if intVal and 1 <> 0 then Result := Result + 'On, '; + if intVal and 2 <> 0 then Result := Result + 'Fill-in, '; + if intVal and 4 <> 0 then Result := Result + 'Red-eye, '; + if intVal and 8 <> 0 then Result := Result + 'Slow-sync, '; + if intval and 16 <> 0 then Result := Result + 'Forced on, '; + if intVal and 32 <> 0 then Result := Result + '2nd curtain, '; + if Result <> '' then + SetLength(Result, Length(Result)-2) + else + Result := inherited; + end; + end else + Result := inherited; +end; + + +//============================================================================== +// initialization +//============================================================================== + initialization RegisterMakerNoteReader(TOlympusMakerNoteReader, 'Olympus', ''); diff --git a/components/fpexif/fpemakernotesanyo.pas b/components/fpexif/fpemakernotesanyo.pas index 06db22493..939be1ea4 100644 --- a/components/fpexif/fpemakernotesanyo.pas +++ b/components/fpexif/fpemakernotesanyo.pas @@ -1,4 +1,4 @@ -unit fpemakernotesanyo; +unit fpeMakerNoteSanyo; {$mode objfpc}{$H+} diff --git a/components/fpexif/fpetags.pas b/components/fpexif/fpetags.pas index af96f4252..2ec2a9ea3 100644 --- a/components/fpexif/fpetags.pas +++ b/components/fpexif/fpetags.pas @@ -311,12 +311,10 @@ type const DefaultTagClasses: array[TTagType] of TTagClass = ( - TIntegerTag, TIntegerTag, TIntegerTag, TFloatTag, // UInt8, UInt16, UInt32, URational - TIntegerTag, TIntegerTag, TIntegerTag, TFloatTag, // SInt8, SInt16, SInt32, SRational - TStringTag, // String - TBinaryTag, // Binary - TFloatTag, TFloatTag, // Single, Double - TSubIFDTag // IFD + TIntegerTag, TStringTag, tIntegerTag, TIntegerTag, TFloatTag, // UInt8, String, UInt16, UInt32, URational + TIntegerTag, TBinaryTag, TIntegerTag, TIntegerTag, TFloatTag, // SInt8, Binary, SInt16, SInt32, SRational + TFloatTag, TFloatTag, // Single, Double + TSubIFDTag // IFD ); function SameIntegerFunc(AKey1, AKey2: String): Boolean; @@ -333,7 +331,7 @@ implementation uses Math, StrUtils, fpeUtils; - (* +(* type TGroupRecord = record TagID: TTagID;