diff --git a/components/fpexif/examples/console_demo/console_demo.lpi b/components/fpexif/examples/console_demo/console_demo.lpi index f89acd0f9..9eab0b2ac 100644 --- a/components/fpexif/examples/console_demo/console_demo.lpi +++ b/components/fpexif/examples/console_demo/console_demo.lpi @@ -1,7 +1,7 @@ - + @@ -22,9 +22,10 @@ - - - + + + + diff --git a/components/fpexif/examples/file_renamer/file_renamer.lpi b/components/fpexif/examples/file_renamer/file_renamer.lpi index 8819052db..eb32bda8a 100644 --- a/components/fpexif/examples/file_renamer/file_renamer.lpi +++ b/components/fpexif/examples/file_renamer/file_renamer.lpi @@ -13,7 +13,6 @@ - diff --git a/components/fpexif/examples/file_renamer/frmain.lfm b/components/fpexif/examples/file_renamer/frmain.lfm index b33bbc084..784699770 100644 --- a/components/fpexif/examples/file_renamer/frmain.lfm +++ b/components/fpexif/examples/file_renamer/frmain.lfm @@ -8,7 +8,7 @@ object Form1: TForm1 ClientWidth = 772 OnCloseQuery = FormCloseQuery OnCreate = FormCreate - LCLVersion = '1.9.0.0' + LCLVersion = '2.1.0.0' object Panel1: TPanel Left = 0 Height = 545 diff --git a/components/fpexif/examples/file_renamer/frmain.pas b/components/fpexif/examples/file_renamer/frmain.pas index 93c37cf8d..ccbdb3035 100644 --- a/components/fpexif/examples/file_renamer/frmain.pas +++ b/components/fpexif/examples/file_renamer/frmain.pas @@ -5,7 +5,7 @@ unit frMain; interface uses - Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Grids, ShellCtrls, + Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ShellCtrls, ExtCtrls, StdCtrls, ComCtrls; type diff --git a/components/fpexif/examples/metadata_viewer/MetadataViewer.lpi b/components/fpexif/examples/metadata_viewer/MetadataViewer.lpi index a657bf228..62a37814a 100644 --- a/components/fpexif/examples/metadata_viewer/MetadataViewer.lpi +++ b/components/fpexif/examples/metadata_viewer/MetadataViewer.lpi @@ -31,7 +31,7 @@ - + @@ -44,6 +44,11 @@ + + + + + diff --git a/components/fpexif/examples/metadata_viewer/MetadataViewer.lpr b/components/fpexif/examples/metadata_viewer/MetadataViewer.lpr index 9ff49df61..8a9e9c796 100644 --- a/components/fpexif/examples/metadata_viewer/MetadataViewer.lpr +++ b/components/fpexif/examples/metadata_viewer/MetadataViewer.lpr @@ -7,7 +7,7 @@ uses cthreads, {$ENDIF}{$ENDIF} Interfaces, // this includes the LCL widgetset - Forms, mdvMain + Forms, mdvMain, fpeMakerNoteSanyo { you can add units after this }; {$R *.res} diff --git a/components/fpexif/examples/metadata_viewer/mdvmain.pas b/components/fpexif/examples/metadata_viewer/mdvmain.pas index 0ae960afb..dbe9705e9 100644 --- a/components/fpexif/examples/metadata_viewer/mdvmain.pas +++ b/components/fpexif/examples/metadata_viewer/mdvmain.pas @@ -7,7 +7,7 @@ interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ShellCtrls, ExtCtrls, ComCtrls, StdCtrls, - fpeMetadata; + fpeMetadata, fpeMakerNote; type @@ -166,6 +166,7 @@ var item: TListItem; i: Integer; ms: TMemoryStream; + suffix: String; begin FImageLoaded := false; Image.Picture.Clear; @@ -193,11 +194,26 @@ begin FImgInfo.ExifData.ExportOptions := FImgInfo.ExifData.ExportOptions + [eoTruncateBinary]; 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 + suffix := ':' + IntToStr(TMakerNoteIntegerTag(lTag).Index) + else if lTag is TMakerNoteFloatTag then + suffix := ':' + IntToStr(TMakerNoteFloatTag(lTag).Index) + else + suffix := ''; + + + if lTag is TVersionTag then + TVersionTag(lTag).Separator := '.'; item := TagListView.Items.Add; item.Data := lTag; item.Caption := 'EXIF.' + NiceGroupNames[lTag.Group]; if CbShowParentTagID.Checked then - item.SubItems.Add(Format('$%.04x:$%.04x', [lTag.TagIDRec.Parent, lTag.TagIDRec.Tag])) + item.SubItems.Add(Format('$%.04x:$%.04x%s', [ + lTag.TagIDRec.Parent, lTag.TagIDRec.Tag, suffix])) else Item.SubItems.Add(Format('$%.04x', [lTag.TagIDRec.Tag])); item.SubItems.Add(lTag.Description); diff --git a/components/fpexif/examples/simple_demo/ExifSimpleDemo.lpi b/components/fpexif/examples/simple_demo/ExifSimpleDemo.lpi index 0a808f5cb..9e620f9a0 100644 --- a/components/fpexif/examples/simple_demo/ExifSimpleDemo.lpi +++ b/components/fpexif/examples/simple_demo/ExifSimpleDemo.lpi @@ -1,7 +1,7 @@ - + @@ -18,9 +18,10 @@ - - - + + + + diff --git a/components/fpexif/examples/simple_demo/sdmain.lfm b/components/fpexif/examples/simple_demo/sdmain.lfm index 54be135a2..aefe179e7 100644 --- a/components/fpexif/examples/simple_demo/sdmain.lfm +++ b/components/fpexif/examples/simple_demo/sdmain.lfm @@ -8,7 +8,7 @@ object MainForm: TMainForm ClientWidth = 788 OnCreate = FormCreate OnDestroy = FormDestroy - LCLVersion = '1.9.0.0' + LCLVersion = '2.1.0.0' object BtnLoad: TButton AnchorSideTop.Control = Owner AnchorSideRight.Control = Owner diff --git a/components/fpexif/examples/simple_demo/sdmain.pas b/components/fpexif/examples/simple_demo/sdmain.pas index cdf895a98..952c3fa4d 100644 --- a/components/fpexif/examples/simple_demo/sdmain.pas +++ b/components/fpexif/examples/simple_demo/sdmain.pas @@ -6,7 +6,7 @@ interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, - ExtCtrls, fpeMetadata; + ExtCtrls, fpeMetadata, fpeMakerNote; type diff --git a/components/fpexif/fpeexifdata.pas b/components/fpexif/fpeexifdata.pas index e7b0d1db0..dafc11ac2 100644 --- a/components/fpexif/fpeexifdata.pas +++ b/components/fpexif/fpeexifdata.pas @@ -75,12 +75,20 @@ type constructor Create(ABigEndian: Boolean); destructor Destroy; override; + { + function AddMakerNoteTag(AIndex: Integer; ATagID: TTagID; ATagName: String; + AData: TBytes; ACount: Integer; ALkUpTbl: String = ''; + AFormatStr: String = ''; ATagType: TTagType = ttUInt8): Integer; overload; + } function AddMakerNoteTag(AIndex: Integer; ATagID: TTagID; ATagName: String; ADataValue: Integer; ALkupTbl: String = ''; AFormatStr: String = ''; ATagType: TTagType = ttUInt16): Integer; overload; function AddMakerNoteTag(AIndex: Integer; ATagID: TTagID; ATagName: String; ADataValue: Double; AFormatStr: String = ''; ATagType: TTagType = ttURational): Integer; overload; + function AddMakerNoteStringTag(AIndex: Integer; ATagID: TTagID; ATagName: String; + AData: TBytes; ACount: Integer; ALkupTbl: String = ''): Integer; + function AddOrReplaceTag(ATag: TTag): Integer; function AddTag(ATag: TTag): Integer; function AddTagByID(ATagID: TTagID): TTag; @@ -174,16 +182,31 @@ type procedure SetAsString(const AValue: String); override; end; - TMakerNoteIntegerTag = class(TIntegerTag) + TMakerNoteStringTag = class(TStringTag) + private + FIndex: Integer; public - constructor Create(ATagID, {%H-}AIndex: Integer; AName: String; AValue: Integer; + constructor Create(ATagID, AIndex: Integer; AName: String; AData: TBytes; + ACount: Integer; ALkupTbl: String; AOptions: TTagOptions); reintroduce; + property Index: Integer read FIndex; + end; + + TMakerNoteIntegerTag = class(TIntegerTag) + private + FIndex: Integer; + public + constructor Create(ATagID, AIndex: Integer; AName: String; AValue: Integer; ALkupTbl, AFormatStr: String; ATagType: TTagType; AOptions: TTagOptions); reintroduce; + property Index: Integer read FIndex; end; TMakerNoteFloatTag = class(TFloatTag) + private + FIndex: Integer; public - constructor Create(ATagID, {%H-}AIndex: Integer; AName: String; AValue: Double; + constructor Create(ATagID, AIndex: Integer; AName: String; AValue: Double; AFormatStr: String; ATagType: TTagType; AOptions: TTagOptions); reintroduce; + property Index: Integer read FIndex; end; TExposureTimeTag = class(TFloatTag) @@ -227,6 +250,14 @@ type function GetAsString: String; override; end; + (* + TSingleTag = class(TBinaryTag) + protected + function GetAsString: String; override; + function GetAsFloat: Double; override; + procedure SetAsFloat(const AValue: Double); override; + end; + *) procedure BuildExifTagDefs; procedure FreeExifTagDefs; @@ -512,6 +543,27 @@ begin FTagList.Free; inherited; end; + { +function TExifData.AddMakerNoteTag(AIndex: Integer; ATagID: TTagID; + ATagName: String; AData: TBytes; ACount: Integer; ALkupTbl: String = ''; + AFormatStr: String = ''; ATagType: TTagType = ttUInt8): Integer; +var + tag: TTag; +begin + tag := TMakerNoteByteTag.Create(ATagID, AIndex, ATagName, AData, ACount, + ALkupTbl, AFormatStr, ATagType, ExportOptionsToTagOptions); + Result := FTagList.Add(tag); +end; + } +function TExifData.AddMakerNoteStringTag(AIndex: Integer; ATagID: TTagID; + ATagName: String; AData: TBytes; ACount: Integer; ALkupTbl: String = ''): Integer; +var + tag: TTag; +begin + tag := TMakerNoteStringTag.Create(ATagID, AIndex, ATagName, AData, ACount, + ALkupTbl, ExportOptionsToTagOptions); + Result := FTagList.Add(tag); +end; function TExifData.AddMakerNoteTag(AIndex: Integer; ATagID: TTagID; ATagName: String; ADataValue: Integer; ALkupTbl: String = ''; AFormatStr: String = ''; @@ -1374,7 +1426,8 @@ begin if not (ATagType in [ttUInt8, ttUInt16, ttUInt32, ttSInt8, ttSInt16, ttSInt32]) then raise EFpExif.Create('Tag type not allowed for TMakerNoteIntegerTag'); - FTagID := ATagID; //AIndex; + FIndex := AIndex; + FTagID := ATagID; FGroup := tgExifMakerNote; FName := AName; FDesc := ''; @@ -1394,7 +1447,8 @@ begin if not (ATagType in [ttURational, ttSRational]) then raise EFpExif.Create('Tag type not allowed for TMakerNoteFloatTag'); - FTagID := ATagID; //AIndex; + FIndex := AIndex; + FTagID := ATagID; FGroup := tgExifMakerNote; FName := AName; FDesc := ''; @@ -1405,6 +1459,23 @@ begin AsFloat := AValue; end; +constructor TMakerNoteStringTag.Create(ATagID, AIndex: Integer; AName: String; + AData: TBytes; ACount: Integer; ALkupTbl: String; + AOptions: TTagOptions); +begin + FIndex := AIndex; + FTagID := ATagID; + FGroup := tgExifMakerNote; + FName := AName; + FDesc := ''; + FType := ttString; + FLkupTbl := ALkUpTbl; + FOptions := [toReadOnly, toVolatile] + AOptions; + FCount := ACount; + SetLength(FRawData, FCount * TagElementSize[ord(FType)]); + Move(AData[0], FRawData[0], Length(FRawData)); +end; + //============================================================================== // TExposureTimeTag @@ -1656,6 +1727,44 @@ begin Result := UTF8Encode(ws); end; + (* +//============================================================================== +// TSingleTag +// +// Binary tag of size 4 which is interpreted as a single value +//============================================================================== + +function TSingleTag.GetAsString: String; +var + sng: Single; + dw: DWord absolute sng; +begin + Move(FRawData[0], dw, 4); + if BigEndian then dw := BEToN(dw) else dw := LEToN(dw); + Result := FloatToStr(sng); +end; + +function TSingleTag.GetAsFloat: Double; +var + sng: Single; + dw: DWord absolute sng; +begin + Move(FRawData[0], dw, 4); + if BigEndian then dw := BEToN(dw) else dw := LEToN(dw); + Result := sng; +end; + +procedure TSingleTag.SetAsFloat(const AValue: Double); +var + sng: Single; + dw: DWord absolute sng; +begin + sng := AValue; + if BigEndian then dw := NToBE(dw) else dw := NToLE(dw); + SetLength(FRawData, 4); + Move(dw, FRawData[0], 4); +end; + *) initialization diff --git a/components/fpexif/fpeexifreadwrite.pas b/components/fpexif/fpeexifreadwrite.pas index e1e0874e7..0a3a25de3 100644 --- a/components/fpexif/fpeexifreadwrite.pas +++ b/components/fpexif/fpeexifreadwrite.pas @@ -68,16 +68,15 @@ type end; TMakerNoteReader = class(TBasicExifReader) - private - FExifVersion: string; protected + FExifVersion: string; FMake: String; FModel: String; FTagDefs: TTagDefList; FDataStartPosition: Int64; + procedure GetTagDefs({%H-}AStream: TStream); virtual; procedure Error(const AMsg: String); override; function FindTagDef(ATagID: TTagID): TTagDef; override; - procedure GetTagDefs(AStream: TStream; AImgFormat: TImgFormat); virtual; function Prepare(AStream: TStream): Boolean; virtual; public constructor Create(AImgInfo: TImgInfo; AStartPos: Int64; @@ -117,8 +116,8 @@ function GetMakerNoteReaderClass(AMake, AModel: String): TMakerNoteReaderClass; implementation uses - Math, Contnrs, - fpeStrConsts, fpeMakerNote, fpeIptcReadWrite; + Contnrs, + fpeStrConsts, fpeIptcReadWrite; const EXIF_SIGNATURE: array[0..5] of AnsiChar = ('E', 'x', 'i', 'f', #0, #0); @@ -146,10 +145,12 @@ begin begin Makes := TStringList.Create; try + Makes.StrictDelimiter := true; + Makes.Delimiter := ';'; ucMake := Uppercase(AMake); for Result:=0 to RegisteredReaders.Count-1 do begin item := TReaderItem(RegisteredReaders[Result]); - Makes.Text := item.Make; + Makes.DelimitedText := item.Make; for j := 0 to Makes.Count-1 do begin if pos(Uppercase(Makes[j]), ucMake) <> 0 then if (item.Model = '') or (AModel = '') or SameText(item.Model, AModel) then @@ -596,6 +597,11 @@ begin inherited; end; +procedure TMakerNoteReader.GetTagDefs(AStream: TStream); +begin + // to be overridden by descendants +end; + { Since the MakerNotes are not well-defined we don't want to abort reading of the entire file by an incorrectly interpreted MakeNote tag. IMPORTANT: All methods calling Error() must be exited afterwards because @@ -620,19 +626,25 @@ begin Result := nil; end; +(* procedure TMakerNoteReader.GetTagDefs(AStream: TStream; AImgFormat: TImgFormat); var UCMake, {%H-}UCModel: String; tmp, tmp2: String; + b: TBytes; p: Integer; streamPos: Int64; + tiffHdrPos: Int64; + ok: Boolean; + dw: DWord; begin UCMake := Uppercase(FMake); UCModel := Uppercase(FModel); - + { if UCMake = 'CANON' then BuildCanonTagDefs(FTagDefs) else + } if UCMake = 'SEIKO' then BuildEpsonTagDefs(FTagDefs) else @@ -646,42 +658,49 @@ begin FBigEndian := false; BuildFujiTagDefs(FTagDefs) end else - (* + { if pos('OLYMP', UCMake) = 1 then //BuildOlympusTagDefs(FTagDefs) -- is done by specific Olympus reader else - if UCMake = 'CASIO' then - { +// if UCMake = 'CASIO' then + // streamPos := AStream.Position; + // if PosInStream('QVC', AStream, streamPos) <> -1 then begin + // FTagDefs := @Casio1Table; + // FNumTagDefs := Length(Casio1Table); + // end else begin + // FTagDefs := @Casio12Table; + // FNumTagDefs := Length(Casio2Table); + // end; + // } + // BuildCasio1TagDefs(FTagDefs) + //else + if UCMake = 'NIKON CORPORATION' then begin + SetLength(b, 20); streamPos := AStream.Position; - if PosInStream('QVC', AStream, streamPos) <> -1 then begin - FTagDefs := @Casio1Table; - FNumTagDefs := Length(Casio1Table); - end else begin - FTagDefs := @Casio12Table; - FNumTagDefs := Length(Casio2Table); - end; - } - BuildCasio1TagDefs(FTagDefs) - else - *) - if UCMake = 'NIKON' then begin - SetLength(tmp, 5); - streamPos := AStream.Position; - AStream.Read(tmp[1], 5); + AStream.Read(b[0], 20); AStream.Position := streamPos; - p := Max(0, Pos(' ', FModel)); - tmp2 := FModel[p+1]; - if (FExifVersion > '0210') or - ((FExifVersion = '') and (tmp2 = 'D') and (AImgFormat = ifTiff)) + SetLength(tmp, 6); + Move(b[0], tmp[1], 6); + if (PosInBytes('Nikon'#00#02#16#00#00'MM'#00#42#00#00#00#08, b) > -1) or + (PosInBytes('Nikon'#00#02#16#00#00'II'#42#00#08#00#00#00, b) > -1) then - BuildNikon2TagDefs(FTagDefs) - else - if (tmp = 'Nikon') then - BuildNikon1TagDefs(FTagDefs) - else - BuildNikon2TagDefs(FTagDefs); + BuildNikon3TagDefs(FTagDefs) + else begin + p := Max(0, Pos(' ', FModel)); + tmp2 := FModel[p+1]; + if (FExifVersion > '0210') or + ((FExifVersion = '') and (tmp2 = 'D') and (AImgFormat = ifTiff)) + then + BuildNikon2TagDefs(FTagDefs) + else + if (tmp = 'Nikon') then + BuildNikon1TagDefs(FTagDefs) + else + BuildNikon2TagDefs(FTagDefs); + end; end; end; +*) function TMakerNoteReader.Prepare(AStream: TStream): Boolean; begin @@ -694,7 +713,7 @@ begin if FDataStartPosition = -1 then FDataStartPosition := AStream.Position; FImgFormat := AImgFormat; - GetTagDefs(AStream, AImgFormat); + GetTagDefs(AStream); if FTagDefs.Count = 0 then exit; AStream.Position := FDataStartPosition; diff --git a/components/fpexif/fpemakernote.pas b/components/fpexif/fpemakernote.pas index f179e714f..168dbe0b9 100644 --- a/components/fpexif/fpemakernote.pas +++ b/components/fpexif/fpemakernote.pas @@ -1,884 +1,12 @@ unit fpeMakerNote; -{$IFDEF FPC} - {$MODE Delphi} -{$ENDIF} - -{$I fpexif.inc} - interface uses - Sysutils, Classes, - fpeGlobal, fpeTags, fpeExifReadWrite; - - -type - TCanonMakerNoteReader = class(TMakerNoteReader) - protected - function AddTag(AStream: TStream; const AIFDRecord: TIFDRecord; - const AData: TBytes; AParent: TTagID): Integer; override; - end; - - TCasioMakerNoteReader = class(TMakerNoteReader) - protected - FVersion: Integer; - function Prepare(AStream: TStream): Boolean; override; - end; - - TMinoltaMakerNoteReader = class(TMakerNoteReader) - protected - function AddTag(AStream: TStream; const AIFDRecord: TIFDRecord; - const AData: TBytes; AParent: TTagID): Integer; override; - end; - - TOlympusMakerNoteReader = class(TMinoltaMakerNoteReader) - protected - FVersion: Integer; - function Prepare(AStream: TStream): Boolean; override; - end; - -procedure BuildCanonTagDefs(AList: TTagDefList); -procedure BuildCasio1TagDefs(AList: TTagDefList); -procedure BuildCasio2TagDefs(AList: TTagDefList); -procedure BuildEpsonTagDefs(AList: TTagDefList); -procedure BuildFujiTagDefs(AList: TTagDefList); -procedure BuildMinoltaTagDefs(AList: TTagDefList); -procedure BuildNikon1TagDefs(AList: TTagDefList); -procedure BuildNikon2TagDefs(AList: TTagDefList); -procedure BuildOlympusTagDefs(AList: TTagDefList); -procedure BuildSanyoTagDefs(AList: TTagDefList); - + fpeMakerNoteCanonCasio, fpeMakerNoteEpson, fpeMakerNoteFuji, + fpeMakerNoteMinolta, fpeMakerNoteNikon, fpeMakerNoteOlympus, + fpeMakerNoteSanyo; implementation -uses - fpeStrConsts, fpeUtils, fpeExifData; - - -//============================================================================== -// TCanonMakerNoteReader -//============================================================================== - -function TCanonMakerNoteReader.AddTag(AStream: TStream; - const AIFDRecord: TIFDRecord; const AData: TBytes; AParent: TTagID): Integer; -var - tagDef: TTagDef; - w: array of Word; - n,i: Integer; -begin - Result := -1; - - tagDef := FindTagDef(AIFDRecord.TagID or AParent); - if (tagDef = nil) then - exit; - - Result := inherited AddTag(AStream, AIFDRecord, AData, AParent); - - // We only handle 16-bit integer types here for further processing - if not (tagDef.TagType in [ttUInt16, ttSInt16]) then - exit; - - // Put binary data into a word array and fix endianness - n := Length(AData) div TagElementSize[ord(tagDef.TagType)]; - if n = 0 then - exit; - - if FBigEndian then - for i:=0 to n-1 do AData[i] := BEtoN(AData[i]) - else - for i:=0 to n-1 do AData[i] := LEtoN(AData[i]); - SetLength(w, n); - Move(AData[0], w[0], Length(AData)); - - // This is a special treatment of array tags which will be added as - // separate "MakerNote" tags. - case AIFDRecord.TagID of - 1: // Exposure Info 1 - with FImgInfo.ExifData do begin - AddMakerNoteTag(1, 1, 'Macro mode', w[1], rsCanonMacroLkup); - if n = 2 then exit; - AddMakerNoteTag(1, 2, 'Self-timer', w[2]/10, '%2:.1f s'); - if n = 3 then exit; - AddMakerNoteTag(1, 3, 'Quality', w[3], rsCanonQualityLkup); - if n = 4 then exit; - AddMakerNoteTag(1, 4, 'Flash mode', w[4], rsCanonFlashLkup); - if n = 5 then exit; - AddMakerNoteTag(1, 5, 'Drive mode', w[5], rsSingleContinuous); - if n = 7 then exit; - AddMakerNoteTag(1, 7, 'Focus mode', w[7], rsCanonFocusLkup); - if n = 9 then exit; - AddMakerNoteTag(1, 9, 'Record mode', w[9], rsCanonRecLkup); - if n = 10 then exit; - AddMakerNoteTag(1,10, 'Image size', w[10], rsCanonSizeLkup); - if n = 11 then exit; - AddMakerNoteTag(1,11, 'Easy shoot', w[11], rsCanonEasyLkup); - if n = 12 then exit; - AddMakerNoteTag(1,12, 'Digital zoom', w[12], rsCanonZoomLkup); - if n = 13 then exit; - AddMakerNoteTag(1,13, 'Contrast', w[13], rsCanonGenLkup); - if n = 14 then exit; - AddMakerNoteTag(1,14, 'Saturation', w[14], rsCanonGenLkup); - if n = 15 then exit; - AddMakerNoteTag(1,15, 'Sharpness', w[15], rsCanonGenLkup); - if n = 16 then exit; - AddMakerNoteTag(1,16, 'CCD ISO', w[16], rsCanonISOLkup); - if n = 17 then exit; - AddMakerNoteTag(1,17, 'Metering mode', w[17], rsCanonMeterLkup); - if n = 18 then exit; - AddMakerNoteTag(1,18, 'Focus type', w[18], rsCanonFocTypeLkup); - if n = 19 then exit; - AddMakerNoteTag(1,19, 'AFPoint', w[19], rsCanonAFLkup); - if n = 20 then exit; - AddMakerNoteTag(1,20, 'Exposure mode', w[20], rsCanonExposeLkup); - if n = 24 then exit; - AddMakerNoteTag(1,24, 'Long focal', w[24]); - if n = 25 then exit; - AddMakerNoteTag(1,25, 'Short focal', w[25]); - if n = 26 then exit; - AddMakerNoteTag(1,26, 'Focal units', w[26]); - if n = 28 then exit; - AddMakerNoteTag(1,28, 'Flash activity', w[28], rsCanonFlashActLkup); - if n = 29 then exit; - AddMakerNoteTag(1,29, 'Flash details', w[29]); - if n = 32 then exit; - AddMakerNoteTag(1,32, 'Focus mode', w[32], rsSingleContinuous); - if n = 33 then exit; - AddMakerNoteTag(1,33, 'AESetting', w[33], rsCanonAELkup); - if n = 34 then exit; - AddMakerNoteTag(1,34, 'Image stabilization', w[34], rsSingleContinuous); - end; - 2: // Focal length - with FImgInfo.ExifData do begin - AddMakerNoteTag(2, 0, 'FocalType', w[0], rsCanonFocalTypeLkup); - if n = 1 then exit; - AddMakerNoteTag(2, 1, 'FocalLength', w[1]); - end; - 4: // ExposureInfo2 - with FImgInfo.ExifData do begin - if n = 7 then exit; - AddMakerNoteTag(4, 7, 'WhiteBalance', w[7], rsCanonWhiteBalLkup); - if n = 8 then exit; - AddMakerNoteTag(4, 8, 'Slow shutter', w[8], rsCanonSloShuttLkup); - if n = 9 then exit; - AddMakerNoteTag(4, 9, 'SequenceNumber', w[9]); - if n = 11 then exit; - AddMakerNoteTag(4,11, 'OpticalZoomStep', w[11]); - if n = 12 then exit; - AddMakerNoteTag(4,12, 'Camera temperature', w[12]); - if n = 14 then exit; - AddMakerNoteTag(4,14, 'AFPoint', w[14]); - if n = 15 then exit; - AddMakerNoteTag(4,15, 'FlashBias', w[15], rsCanonBiasLkup); - if n = 19 then exit; - AddMakerNoteTag(4,19, 'Distance', w[19]); - if n = 21 then exit; - AddMakerNoteTag(4,21, 'FNumber', w[21]); - if n = 22 then exit; - AddMakerNoteTag(4,22, 'Exposure time', w[22]); - if n = 23 then exit; - AddMakerNoteTag(4,23, 'Measured EV2', w[23]); - if n = 24 then exit; - AddMakerNoteTag(4,24, 'Bulb duration', w[24]); - if n = 26 then exit; - AddMakerNoteTag(4,26, 'Camera type', w[26], rsCanonCamTypeLkup); - if n = 27 then exit; - AddMakerNoteTag(4,27, 'Auto rotation', w[27], rsCanonAutoRotLkup); - if n = 28 then exit; - AddMakerNoteTag(4,28, 'NDFilter', w[28], rsCanonGenLkup); - end; - 5: // Panorma - with FImgInfo.ExifData do begin - if n = 2 then exit; - AddMakerNoteTag(5, 2, 'Panorama frame number', w[2]); - if n = 5 then exit; - AddMakerNoteTag(5, 5, 'Panorama direction', w[5], rsCanonPanDirLkup); - end; - end; -end; - -//============================================================================== -// TCasioMakerNoteReader -//============================================================================== -function TCasioMakerNoteReader.Prepare(AStream: TStream): Boolean; -var - p: Int64; - hdr: Array[0..5] of ansichar; -begin - Result := false; - - p := AStream.Position; - AStream.Read({%H-}hdr[0], SizeOf(hdr)); - if (hdr[0] = 'Q') and (hdr[1] = 'V') and (hdr[2] = 'C') and - (hdr[3] = #0) and (hdr[4] = #0) and (hdr[5] = #0) - then begin - FVersion := 2; - BuildCasio2TagDefs(FTagDefs); - AStream.Position := p + SizeOf(hdr); - end else - begin - FVersion := 1; - BuildCasio1TagDefs(FTagDefs); - AStream.Position := p; - end; - - FBigEndian := true; - Result := true; -end; - - -//============================================================================== -// TMinoltaMakerNoteReader -//============================================================================== -function TMinoltaMakerNoteReader.AddTag(AStream: TStream; - const AIFDRecord: TIFDRecord; const AData: TBytes; AParent: TTagID): Integer; -var - tagDef: TTagDef; - v: array of DWord; - n, i: Integer; - t: TTagID; - d: Integer; - isDiMAGE7Hi: Boolean; - //p: PByte; -begin - Result := -1; - - tagDef := FindTagDef(AIFDRecord.TagID or AParent); - if (tagDef = nil) then - exit; - - Result := inherited AddTag(AStream, AIFDRecord, AData, AParent); - - // This is a special treatment of array tags which will be added as - // separate "MakerNote" tags. - // Ref: https://sno.phy.queensu.ca/~phil/exiftool/TagNames/Minolta.html#CameraSettings - t := AIFDRecord.TagID; - case AIFDRecord.TagID of - $0001, - $0003: // Minolta camera settings tags - // Contains an array of ULong values encoded in big-endian style, - // regardless of the byte order in the picture (i.e., even if the - // JPEG or TIFF itself is little-endian). - begin - // Put binary data into a DWord array and fix endianness - // ASSUMING HERE THAT DATA ARE ULONG HERE! - n := Length(AData) div TagElementSize[ord(ttUInt32)]; - SetLength(v, n); - Move(AData[0], v[0], Length(AData)); - for i:=0 to n-1 do - v[i] := BEtoN(v[i]); - // Fix problem with DiMAGE7Hi (http://www.dalibor.cz/software/minolta-makernote) - isDiMAGE7Hi := FModel = 'DiMAGE7Hi'; - if isDiMAGE7Hi then d := 1 else d := 0; - with FImgInfo.ExifData do begin - AddMakerNoteTag(t, 1, 'Exposure mode', v[1], rsMinoltaExposureModeLkup, '', ttUInt32); - AddMakerNoteTag(t, 2, 'Flash mode', v[2], rsMinoltaFlashModeLkup, '', ttUInt32); - AddMakerNoteTag(t, 3, 'White balance', v[3], '', '', ttUInt32); - AddMakerNoteTag(t, 4, 'Minolta image size', v[4], rsMinoltaImageSizeLkup1, '', ttUInt32); - AddMakerNoteTag(t, 5, 'Minolta quality', v[5], rsMinoltaQualityLkup, '', ttUInt32); - AddMakerNoteTag(t, 6, 'Drive mode', v[6], rsMinoltaDriveModeLkup, '', ttUInt32); - AddMakerNoteTag(t, 7, 'Metering mode', v[7], rsMinoltaMeteringModeLkup, '', ttUInt32); - AddMakerNoteTag(t, 8, 'ISO', v[8], '', '', ttUInt32); - AddMakerNoteTag(t, 9, 'Exposure time', v[9], '', '', ttUInt32); - AddMakerNoteTag(t,10, 'F number', v[10], '', '', ttUInt32); - AddMakerNoteTag(t,11, 'Macro mode', v[11], rsOffOn, '', ttUInt32); - AddMakerNoteTag(t,12, 'Digital zoom', v[12], rsMinoltaDigitalZoomLkup, '', ttUInt32); - AddMakerNoteTag(t,13, 'Exposure compensation', v[13], '', '', ttUInt32); - AddMakerNoteTag(t,14, 'Bracket step', v[14], rsMinoltaBracketStepLkup, '', ttUInt32); - AddMakerNoteTag(t,16, 'Interval length', v[16], '', '', ttUInt32); - AddMakerNoteTag(t,17, 'Interval number', v[17], '', '', ttUInt32); - AddMakerNoteTag(t,18, 'Focal length', v[18], '', '', ttUInt32); // crashes - AddMakerNoteTag(t,19, 'Focus distance', v[19], '', '', ttUInt32); - AddMakerNoteTag(t,20, 'Flash fired', v[20], rsNoYes, '', ttUInt32); - AddMakerNoteTag(t,21, 'Minolta date', v[21], '', '', ttUInt32); - AddMakerNoteTag(t,22, 'Minolta time', v[22], '', '', ttUInt32); - AddMakerNoteTag(t,23, 'Max aperture', v[23], '', '', ttUInt32); - AddMakerNoteTag(t,26, 'File number memory', v[26], rsOffOn, '', ttUInt32); - AddMakerNoteTag(t,27, 'Last file number', v[27], '', '', ttUInt32); - AddMakerNoteTag(t,28, 'Color balance red', v[28], '', '', ttUInt32); - AddMakerNoteTag(t,29, 'Color balance green', v[29], '', '', ttUInt32); - AddMakerNoteTag(t,30, 'Color balance blue', v[30], '', '', ttUInt32); - AddMakerNoteTag(t,31, 'Saturation', v[31], '', '', ttUInt32); - AddMakerNoteTag(t,32, 'Contrast', v[32], '', '', ttUInt32); - AddMakerNoteTag(t,33, 'Sharpness', v[33], rsMinoltaSharpnessLkup, '', ttUInt32); - AddMakerNoteTag(t,34, 'Subject program', v[34], rsMinoltaSubjectProgramLkup, '', ttUInt32); - AddMakerNoteTag(t,35, 'Flash exposure compensation', v[35], '', '', ttUInt32); - AddMakerNoteTag(t,36, 'AE setting', v[36], rsMinoltaIsoSettingLkup, '', ttUInt32); - AddMakerNoteTag(t,37, 'Minolta model ID', v[37], rsMinoltaModelIDLkup, '', ttUInt32); - AddMakerNoteTag(t,38, 'Interval mode', v[38], rsMinoltaIntervalModeLkup, '', ttUInt32); - AddMakerNoteTag(t,39, 'Folder name', v[39], rsMinoltaFolderNameLkup, '', ttUInt32); - AddMakerNoteTag(t,40, 'Color mode', v[40], rsMinoltaColorModeLkup, '', ttUInt32); - AddMakerNoteTag(t,41, 'Color filter', v[41], '', '', ttUInt32); - AddMakerNoteTag(t,42, 'BW filter', v[42], '', '', ttUInt32); - AddMakerNoteTag(t,43, 'Internal flash', v[43], rsMinoltaInternalFlashLkup, '', ttUInt32); - AddMakerNoteTag(t,44, 'Brightness', v[44], '', '', ttUInt32); - AddMakerNoteTag(t,45, 'Spot focus point X', v[45], '', '', ttUInt32); - AddMakerNoteTag(t,46, 'Spot focus point Y', v[46], '', '', ttUInt32); - AddMakerNoteTag(t,47, 'Wide focus zone', v[47], rsMinoltaWideFocusZoneLkup, '', ttUInt32); - AddMakerNoteTag(t,48, 'Focus mode', v[48], rsMinoltaFocusModeLkup, '', ttUInt32); - AddMakerNoteTag(t,49, 'Focus area', v[49], rsMinoltaFocusAreaLkup, '', ttUInt32); - AddMakerNoteTag(t,50, 'DEC position', v[50], rsMinoltaDECPositionLkup, '', ttUInt32); - if isDiMAGE7Hi then - AddMakerNoteTag(t,51, 'Color profile', v[51], rsMinoltaColorProfileLkup, '', ttUInt32); - AddMakerNoteTag(t,51+d, 'Data imprint', v[52], rsMinoltaDataImprintLkup, '', ttUInt32); - AddMakerNoteTag(t,63+d, 'Flash metering', v[63], rsMinoltaFlashMeteringLkup, '', ttUInt32); // or is the index 53? - end; - end; - $0010: // CameraInfoA100 - begin - //p := @AData[0]; - //... conversion stopped due to unclear documentation on - // https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Minolta.html#CameraInfoA100 - // --- Is there an index 0? - end; - end; -end; - - -//============================================================================== -// TOlympusMakerNoteReader -//============================================================================== - -{ Read the header and determine the version of the olympus makernotes: - - version 1: header OLYMP#0#1+0, offsets relative to EXIF - - version 2: header OLYMP#0#2#0, offsets relative to EXIF - - version 3: header OLYMPUS#0 + BOM (II or MM) + version (#3#0) - offsets relative to maker notes !!!! } -function TOlympusMakerNoteReader.Prepare(AStream: TStream): Boolean; -var - p: Int64; - hdr: packed array[0..11] of ansichar; -begin - Result := false; - - // Remember begin of makernotes tag. - p := AStream.Position; - - // Read header - AStream.Read(hdr{%H-}, 12); - - // The first 5 bytes must be 'OLYMP'; this is common to all versions - if not ((hdr[0] = 'O') and (hdr[1] = 'L') and (hdr[2] = 'Y') and (hdr[3] = 'M') and (hdr[4] = 'P')) then - exit; - - FVersion := 0; - // Version 1 or 2 if a #0 follows after the 'OLYMP' - if (hdr[5] = #0) then begin - if (hdr[6] = #1) and (hdr[7] = #0) then - FVersion := 1 - else - if (hdr[6] = #2) and (hdr[7] = #0) then - FVersion := 2; - end else - // Version 3 if the first 8 bytes are 'OLYMPUS'#0 - if (hdr[5] = 'U') and (hdr[6] = 'S') and (hdr[7] = #0) then begin - // Endianness marker, like in standard EXIF: 'II' or 'MM' - if (hdr[8] = 'I') and (hdr[9] = 'I') then - FBigEndian := false - else - if (hdr[8] = 'M') and (hdr[9] = 'M') then - FBigEndian := true; - if (hdr[10] = #3) then - FVersion := 3; - FStartPosition := p; // Offsets are relative to maker notes - end; - - // Jump to begin of IFD - case FVersion of - 1, 2: AStream.Position := p + 8; - 3 : AStream.Position := p + 12; - else exit; - end; - - BuildOlympusTagDefs(FTagDefs); - Result := true; -end; - - - (* -{ Read the header and determine the version of the olympus makernotes: - - version 1: header OLYMP#0#1+0, offsets relative to EXIF - - version 2: header OLYMP#0#2#0, offsets relative to EXIF - - version 3: header OLYMPUS#0 + BOM (II or MM) + version (#3#0) - offsets relative to maker notes !!!! } -procedure TOlympusMakerNoteReader.ReadIFD(AStream: TStream; AParent: TTagID); -//procedure TOlympusMakerNoteReader.ReadIFD(AStream: TStream; AGroup: TTagGroup); -var - p: Int64; - hdr: packed array[0..11] of ansichar; -begin - if TTagIDRec(AParent).Parent = TAG_MAKERNOTE then - begin -// if AGroup = tgExifMakerNote then - // Remember begin of makernotes tag. - p := AStream.Position; - - // Read header - AStream.Read(hdr, 12); - - // The first 5 bytes must be 'OLYMP'; this is common to all versions - if not ((hdr[0] = 'O') and (hdr[1] = 'L') and (hdr[2] = 'Y') and (hdr[3] = 'M') and (hdr[4] = 'P')) then - exit; - - FVersion := 0; - // Version 1 or 2 if a #0 follows after the 'OLYMP' - if (hdr[5] = #0) then begin - if (hdr[6] = #1) and (hdr[7] = #0) then - FVersion := 1 - else - if (hdr[6] = #2) and (hdr[7] = #0) then - FVersion := 2; - end else - // Version 3 if the first 8 bytes are 'OLYMPUS'#0 - if (hdr[5] = 'U') and (hdr[6] = 'S') and (hdr[7] = #0) then begin - // Endianness marker, like in standard EXIF: 'II' or 'MM' - if (hdr[8] = 'I') and (hdr[9] = 'I') then - FBigEndian := false - else - if (hdr[8] = 'M') and (hdr[9] = 'M') then - FBigEndian := true; - if (hdr[10] = #3) then - FVersion := 3; - FStartPosition := p; // Offsets are relative to maker notes - end; - - // Jump to begin of IFD - case FVersion of - 1, 2: AStream.Position := p + 8; - 3 : AStream.Position := p + 12; - else exit; - end; - - BuildOlympusTagDefs(FTagDefs) - end; - - inherited; -end; - *) - -//============================================================================== -// Tag definition lists -//============================================================================== - -const - M = DWord(TAGPARENT_MAKERNOTE); - -procedure BuildCanonTagDefs(AList: TTagDefList); -begin - Assert(AList <> nil); - with AList do begin - AddUShortTag(M+$0001, 'ExposureInfo1'); - AddUShortTag(M+$0002, 'Panorama'); - AddUShortTag(M+$0004, 'ExposureInfo2'); - AddStringTag(M+$0006, 'ImageType'); - AddStringTag(M+$0007, 'FirmwareVersion'); - AddULongTag (M+$0008, 'ImageNumber'); - AddStringTag(M+$0009, 'OwnerName'); - AddULongTag (M+$000C, 'CameraSerialNumber'); - AddUShortTag(M+$000F, 'CustomFunctions'); - end; -end; - -{ Casio Type 1 - Standard TIFF IFD Data using Casio Type 1 Tags but always uses - Motorola (Big-Endian) byte alignment - This makernote has no header - the IFD starts immediately - Ref.: http://www.ozhiker.com/electronics/pjmt/jpeg_info/casio_mn.html } -procedure BuildCasio1TagDefs(AList: TTagDefList); -begin - Assert(AList <> nil); - with AList do begin - AddUShortTag(M+$0001, 'RecordingMode', 1, '', rsCasioRecordingModeLkup); - AddUShortTag(M+$0002, 'Quality', 1, '', rsEconomyNormalFine1); - AddUShortTag(M+$0003, 'FocusingMode', 1, '', rsCasioFocusingModeLkup); - AddUShortTag(M+$0004, 'FlashMode', 1, '', rsCasioFlashModeLkup); - AddUShortTag(M+$0005, 'FlashIntensity', 1, '', rsCasioFlashIntensityLkup); - AddULongTag (M+$0006, 'ObjectDistance', 1, '', '', '%d mm'); - AddUShortTag(M+$0007, 'WhiteBalance', 1, '', rsCasioWhiteBalanceLkup); - AddULongTag (M+$000A, 'DigitalZoom', 1, '', rsCasioDigitalZoomLkup); - AddUShortTag(M+$000B, 'Sharpness', 1, '', rsNormalSoftHard); - AddUShortTag(M+$000C, 'Contrast', 1, '', rsNormalLowHigh); - AddUShortTag(M+$000D, 'Saturation', 1, '', rsNormalLowHigh); - AddUShortTag(M+$000A, 'DigitalZoom', 1, '', rsCasioDigitalZoomLkup); - AddUShortTag(M+$0014, 'CCDSensitivity', 1, '', rsCasioCCDSensitivityLkup); - end; -end; - -{ Case Type 2 - Header: 6 Bytes "QVC\x00\x00\x00" - IFD Data: Standard TIFF IFD Data using Casio Type 2 Tags but always uses - Motorola (Big-Endian) Byte Alignment. - All EXIF offsets are relative to the start of the TIFF header at the beginning of the EXIF segment - Ref.: http://www.ozhiker.com/electronics/pjmt/jpeg_info/casio_mn.html - http://www.exiv2.org/tags-casio.html - https://sno.phy.queensu.ca/~phil/exiftool/TagNames/Casio.html#Type2 -} -procedure BuildCasio2TagDefs(AList: TTagDefList); -begin - Assert(AList <> nil); - with AList do begin - AddUShortTag (M+$0002, 'PreviewImageSize', 2); // width and height, in pixels - AddULongTag (M+$0003, 'PreviewImageLength'); - AddULongTag (M+$0004, 'PreviewImageStart'); - AddUShortTag (M+$0008, 'QualityMode', 1, '', rsEconomyNormalFine); - AddUShortTag (M+$0009, 'ImageSize', 1, '', rsCasioImageSize2Lkup); - AddUShortTag (M+$000D, 'FocusMode', 1, '', rsCasioFocusMode2Lkup); - AddUShortTag (M+$0014, 'ISOSpeed', 1, '', rsCasioISOSpeed2Lkup); - AddUShortTag (M+$0019, 'WhiteBalance', 1, '', rsCasioWhiteBalance2Lkup); - AddURationalTag(M+$001D, 'FocalLength'); - AddUShortTag (M+$001F, 'Saturation', 1, '', rsLowNormalHigh); - AddUShortTag (M+$0020, 'Contrast', 1, '', rsLowNormalHigh); - AddUShortTag (M+$0021, 'Sharpness', 1, '', rsCasioSharpness2Lkup); - AddBinaryTag (M+$0E00, 'PrintIM'); - AddBinaryTag (M+$2000, 'PreviewImage'); - AddStringTag (M+$2001, 'FirwareDate', 18); - AddUShortTag (M+$2011, 'WhiteBalanceBias', 2); - AddUShortTag (M+$2012, 'WhiteBalance2', 2, '', rsCasioWhiteBalance22Lkup); - AddUShortTag (M+$2021, 'AFPointPosition', 4); - AddULongTag (M+$2022, 'ObjectDistance'); - AddUShortTag (M+$2034, 'FlashDistance'); - AddByteTag (M+$2076, 'SpecialEffectMode', 3); // to do: array lkup - should be: '0 0 0' = Off,'1 0 0' = Makeup,'2 0 0' = Mist Removal,'3 0 0' = Vivid Landscape - AddBinaryTag (M+$2089, 'FaceInfo'); - AddByteTag (M+$211C, 'FacesDetected'); - AddUShortTag (M+$3000, 'RecordMode', 1, '', rsCasioRecordMode2Lkup); - AddUShortTag (M+$3001, 'ReleaseMode', 1, '', rsCasioReleaseMode2Lkup); - AddUShortTag (M+$3002, 'Quality', 1, '', rsEconomyNormalFine1); - AddUShortTag (M+$3003, 'FocusMode2', 1, '', rsCasioFocusMode2Lkup); - AddStringTag (M+$3006, 'HometownCity'); - AddUShortTag (M+$3007, 'BestShotMode'); // Lkup depends severly on camera model - AddUShortTag (M+$3008, 'AutoISO', 1, '', rsCasioAutoIso2Lkup); - AddUShortTag (M+$3009, 'AFMode', 1, '', rsCasioAFMode2Lkup); - AddBinaryTag (M+$3011, 'Sharpness2'); - AddBinaryTag (M+$3012, 'Contrast2'); - AddBinaryTag (M+$3013, 'Saturation2'); - AddUShortTag (M+$3014, 'ISO'); - AddUShortTag (M+$3015, 'ColorMode', 1, '', rsCasioColorMode2Lkup); - AddUShortTag (M+$3016, 'Enhancement', 1, '', rsCasioEnhancement2Lkup); - AddUShortTag (M+$3017, 'ColorFilter', 1, '', rsCasioColorFilter2Lkup); - AddUShortTag (M+$301B, 'ArtMode', 1, '', rsCasioArtMode2Lkup); - AddUShortTag (M+$301C, 'SequenceNumber'); - AddUShortTag (M+$301D, 'BracketSequence', 2); - AddUShortTag (M+$3020, 'ImageStabilization', 1, '', rsCasioImageStabilization2Lkup); - AddUShortTag (M+$302A, 'LightingMode', 1, '', rsCasioLightingMode2Lkup); - AddUShortTag (M+$302B, 'PortraitRefiner', 1, '', rsCasioPortraitRefiner2Lkup); - AddUShortTag (M+$3030, 'SpecialEffectLevel'); - AddUShortTag (M+$3031, 'SpecialEffectSetting', 1, '', rsCasioSpecialEffectSetting2Lkup); - AddUShortTag (M+$3103, 'DriveMode', 1, '', rsCasioDriveMode2Lkup); - AddBinaryTag (M+$310B, 'ArtModeParameters', 3); - AddUShortTag (M+$4001, 'CaptureFrameRate'); - AddUShortTag (M+$4003, 'VideoQuality', 1, '', rsCasioVideoQuality2Lkup); - - // to do... - end; -end; - -procedure BuildEpsonTagDefs(AList: TTagDefList); -begin - Assert(AList <> nil); - with AList do begin - AddUShortTag(M+$0200, 'SpecialMode'); - AddUShortTag(M+$0201, 'JpegQuality'); - AddUShortTag(M+$0202, 'Macro'); - AddUShortTag(M+$0204, 'DigitalZoom'); - AddUShortTag(M+$0209, 'CameraID'); - AddStringTag(M+$020A, 'Comments'); - AddUShortTag(M+$020B, 'Width'); - AddUShortTag(M+$020C, 'Height'); - AddUShortTag(M+$020D, 'SoftRelease'); - end; -end; - -procedure BuildFujiTagDefs(AList: TTagDefList); -begin - Assert(AList <> nil); - with AList do begin - AddBinaryTag (M+$0000, 'Version'); - AddStringTag (M+$1000, 'Quality'); - AddUShortTag (M+$1001, 'Sharpness', 1, '', rsFujiSharpnessLkup); - AddUShortTag (M+$1002, 'WhiteBalance', 1, '', rsFujiWhiteBalLkup); - AddUShortTag (M+$1003, 'Saturation', 1, '', rsFujiSaturationLkup); - AddUShortTag (M+$1004, 'Contrast', 1, '', rsFujiContrastLkup); - AddUShortTag (M+$1005, 'ColorTemperature'); - AddUShortTag (M+$1006, 'Contrast', 1, '', rsFujiContrastLkup1); - AddURationalTag(M+$100A, 'WhiteBalanceFineTune'); - AddUShortTag (M+$100B, 'NoiseReduction', 1, '', rsFujiNoiseReductionLkup); - AddUShortTag (M+$100E, 'HighISONoiseReduction', 1, '', rsFujiHighIsoNoiseReductionLkup); - AddUShortTag (M+$1010, 'FlashMode', 1, '', rsFujiFlashModeLkup); - AddURationalTag(M+$1011, 'FlashStrength'); - AddUShortTag (M+$1020, 'Macro', 1, '', rsOffOn); - AddUShortTag (M+$1021, 'FocusMode', 1, '', rsAutoManual); - AddUShortTag (M+$1030, 'SlowSync', 1, '', rsOffOn); - AddUShortTag (M+$1031, 'PictureMode', 1, '', rsFujiPictureModeLkup); - AddUShortTag (M+$1032, 'ExposureCount'); - AddUShortTag (M+$1033, 'EXRAuto', 1, '', rsAutoManual); - AddUShortTag (M+$1034, 'EXRMode', 1, '', rsFujiEXRModeLkup); - AddSLongTag (M+$1040, 'ShadowTone', 1, '', rsFujiShadowHighlightLkup); - AddSLongTag (M+$1041, 'HighlightTone', 1, '', rsFujiShadowHighlightLkup); - AddULongTag (M+$1044, 'DigitalZoom'); - AddUShortTag (M+$1050, 'ShutterType', 1, '', rsFujiShutterTypeLkup); - AddUShortTag (M+$1100, 'AutoBracketing', 1, '', rsFujiAutoBracketingLkup); - AddUShortTag (M+$1101, 'SequenceNumber'); - AddUShortTag (M+$1153, 'PanoramaAngle'); - AddUShortTag (M+$1154, 'PanoramaDirection', 1, '', rsFujiPanoramaDirLkup); - AddULongTag (M+$1201, 'AdvancedFilter', 1, '', rsFujiAdvancedFilterLkup); - AddUShortTag (M+$1210, 'ColorMode', 1, '', rsFujiColorModeLkup); - AddUShortTag (M+$1300, 'BlurWarning', 1, '', rsFujiBlurWarningLkup); - AddUShortTag (M+$1301, 'FocusWarning', 1, '', rsFujiFocusWarningLkup); - AddUShortTag (M+$1302, 'ExposureWarning', 1, '', rsFujiExposureWarningLkup); - AddUShortTag (M+$1400, 'DynamicRange', 1, '', rsFujiDynamicRangeLkup); - AddURationalTag(M+$1404, 'MinFocalLength'); - AddURationalTag(M+$1405, 'MaxFocalLength'); - AddURationalTag(M+$1406, 'MaxApertureAtMinFocal'); - AddURationalTag(M+$1407, 'MaxApertureAtMaxFocal'); - AddUShortTag (M+$140B, 'AutoDynamicRange'); - AddUShortTag (M+$1422, 'ImageStabilization', 3); - AddUShortTag (M+$1425, 'SceneRecognition', 1, '', rsFujiSceneRecognLkup); - AddUShortTag (M+$1431, 'Rating'); - AddStringTag (M+$8000, 'FileSource'); - AddULongTag (M+$8002, 'OrderNumber'); - AddUShortTag (M+$8003, 'FrameNumber'); - end; -end; - -{ The Minolta MakerNote can be quite long, about 12 kB. In the beginning - of this tag there is a normal tag directory in usual format. - References: - - http://www.dalibor.cz/software/minolta-makernote - - https://sno.phy.queensu.ca/~phil/exiftool/TagNames/Minolta.html } -procedure BuildMinoltaTagDefs(AList: TTagDefList); -begin - Assert(AList <> nil); - with AList do begin - { This tag stores the string 'MLT0', not zero-terminated, as an identifier } - AddBinaryTag (M+$0000, 'Version', 4, '', '', '', TVersionTag); - - { Stores all settings which were in effect when taking the picture. - Details depend on camera. } - AddBinaryTag (M+$0001, 'MinoltaCameraSettingsOld'); // Camera D5, D7, S304, S404 - AddBinaryTag (M+$0003, 'MinoltaCameraSettings'); // Camera D7u, D7i, D7Hi - - // this is the size of the JPEG (compressed) or TIFF or RAW file. - AddULongTag (M+$0040, 'CompressedImageSize'); - - { Stores the thumbnail image (640×480). It is in normal JFIF format but the - first byte should be changed to 0xFF. Beware! Sometimes the thumbnail - is not stored in the file and this tag points beyond the end of the file. } - AddBinaryTag (M+$0081, 'ReviewImage'); - - { The cameras D7u, D7i and D7Hi no longer store the thumbnail inside the tag. - It has instead two tags describing the position of the thumbnail in the - file and its size } - AddULongTag (M+$0088, 'PreviewImageStart'); - AddULongTag (M+$0089, 'PreviewImageLength'); - - AddULongTag (M+$0100, 'SceneMode', 1, '', rsMinoltaSceneModeLkup); - AddULongTag (M+$0101, 'ColorMode', 1, '', rsMinoltaColorModeLkup); - AddULongtag (M+$0102, 'Quality', 1, '', rsMinoltaQualityLkup); - AddULongTag (M+$0103, 'ImageSize', 1, '', rsMinoltaImageSizeLkup); - AddSRationalTag(M+$0104, 'FlashExposureComp'); - AddULongTag (M+$0105, 'TeleConverter', 1, '', rsMinoltaTeleconverterLkup); - AddULongTag (M+$0107, 'ImageStabilization', 1, '', rsMinoltaImageStabLkup); - AddULongTag (M+$0109, 'RawAndJpegRecording', 1, '', rsOffOn); - AddULongTag (M+$010A, 'ZoneMatching', 1, '', rsMinoltaZoneMatchingLkup); - AddULongTag (M+$010B, 'ColorTemperature', 1); - AddULongTag (M+$010C, 'LensType', 1); - AddSLongTag (M+$0111, 'ColorCompensationFilter', 1); - AddULongTag (M+$0112, 'WhiteBalanceFileTune', 1); - AddULongTag (M+$0113, 'ImageStabilization', 1, '', rsOffOn); - AddULongTag (M+$0115, 'WhiteBalance', 1, '', rsMinoltaWhiteBalanceLkup); - AddBinaryTag (M+$0E00, 'PrintPIM'); - end; -end; - -// not tested -procedure BuildNikon1TagDefs(AList: TTagDefList); -begin - Assert(AList <> nil); - with AList do begin - AddUShortTag(M+$0002, 'FamilyID'); - AddUShortTag(M+$0003, 'Quality', 1, '', rsNikonQualityLkup); - AddUShortTag(M+$0004, 'ColorMode', 1, '', rsNikonColorModeLkup); - AddUShortTag(M+$0005, 'ImageAdjustment', 1, '', rsNikonImgAdjLkup); - AddUShortTag(M+$0006, 'ISOSpeed', 1, '', rsNikonISOLkup); - AddUShortTag(M+$0007, 'WhiteBalance', 1, '', rsNikonWhiteBalanceLkup); - AddUShortTag(M+$0008, 'Focus'); - AddUShortTag(M+$000A, 'DigitalZoom'); - AddUShortTag(M+$000B, 'Converter', 1, '', rsNikonConverterLkup); - end; -end; - -{ for Nikon D1, E880, E885, E990, E995, E2500, E5000 - Ref http://www.tawbaware.com/990exif.htm - https://sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html } -procedure BuildNikon2TagDefs(AList: TTagDefList); -begin - Assert(AList <> nil); - with AList do begin - AddBinaryTag (M+$0001, 'Version', 4, '', '', '', TVersionTag); - AddUShortTag (M+$0002, 'ISO', 2); - AddStringTag (M+$0003, 'ColorMode'); - AddStringTag (M+$0004, 'Quality'); - AddStringTag (M+$0005, 'WhiteBalance'); - AddStringtag (M+$0006, 'ImageSharpening'); - AddStringTag (M+$0007, 'FocusMode'); - AddStringTag (M+$0008, 'FlashSetting'); - AddStringTag (M+$0009, 'FlashType'); - AddURationalTag(M+$000A, 'UNKNOWN'); - AddStringTag (M+$000F, 'ISOSelection'); - AddStringTag (M+$0080, 'ImageAdjustment'); - AddStringTag (M+$0081, 'ToneComp'); - AddStringTag (M+$0082, 'AuxiliaryLens'); - AddURationalTag(M+$0085, 'ManualFocusDistance'); - AddURationalTag(M+$0086, 'DigitalZoom'); - AddBinaryTag (M+$0088, 'AFInfo'); - AddStringTag (M+$008D, 'ColorHue'); - AddStringTag (M+$008F, 'SceneMode'); - AddStringTag (M+$0090, 'LightSource'); - AddBinaryTag (M+$0010, 'DataDump'); - end; -end; - -// 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 - -procedure BuildOlympusTagDefs(AList: TTagDefList); -begin - Assert(AList <> nil); - with AList do begin - AddBinaryTag (M+$0000, 'Version', 4, '', '', '', TVersionTag); - - { Stores all settings which were in effect when taking the picture. - Details depend on camera. } - AddBinaryTag (M+$0001, 'MinoltaCameraSettingsOld'); //, $FFFF, '', '', '', TSubIFDTag, true); - AddBinaryTag (M+$0003, 'MinoltaCameraSettings'); //, $FFFF, '', '', '', TSubIFDTag, false); - - // this is the size of the JPEG (compressed) or TIFF or RAW file. - AddULongTag (M+$0040, 'CompressedImageSize'); - - { Stores the thumbnail image (640×480). It is in normal JFIF format but the - first byte should be changed to 0xFF. Beware! Sometimes the thumbnail - is not stored in the file and this tag points beyond the end of the file. } - AddBinaryTag (M+$0081, 'ReviewImage'); - - { The cameras D7u, D7i and D7Hi no longer store the thumbnail inside the tag. - It has instead two tags describing the position of the thumbnail in the - file and its size } - AddULongTag (M+$0088, 'PreviewImageStart'); - AddULongTag (M+$0089, 'PreviewImageLength'); - - AddULongTag (M+$0200, 'SpecialMode', 3); - AddUShortTag (M+$0201, 'JpegQuality', 1, '', rsOlympusJpegQualLkup); - AddUShortTag (M+$0202, 'Macro', 1, '', rsOlympusMacroLkup); - AddURationalTag(M+$0204, 'DigitalZoom'); -// AddUShortTag (M+$0207, 'Firmware'); - AddStringTag (M+$9207, 'CameraType'); - AddStringTag (M+$0208, 'PictureInfo'); - AddStringTag (M+$0209, 'CameraID'); - AddUShortTag (M+$020B, 'EpsonImageWidth'); - AddUShortTag (M+$020C, 'EpsonImageHeight'); - AddStringTag (M+$020D, 'EpsonSoftware'); - AddUShortTag (M+$0403, 'SceneMode', 1, '', rsOlympusSceneModeLkup); - AddStringTag (M+$0404, 'SerialNumber'); - AddStringTag (M+$0405, 'Firmware'); - AddSRationalTag(M+$1000, 'ShutterSpeedValue'); - AddSRationalTag(M+$1001, 'ISOValue'); - AddSRationalTag(M+$1002, 'ApertureValue'); - AddSRationalTag(M+$1003, 'BrightnessValue'); - AddUShortTag (M+$1004, 'FlashMode', 1, '', rsOlympusFlashModeLkup); - AddUShortTag (M+$1005, 'FlashDevice', 1, '', rsOlympusFlashDevLkup); - AddURationalTag(M+$1006, 'Bracket'); - AddSShortTag (M+$1007, 'SensorTemperature'); - AddSShortTag (M+$1008, 'LensTemperature'); - AddUShortTag (M+$100B, 'FocusMode', 1, '', rsAutoManual); - AddURationalTag(M+$100C, 'FocusDistance'); - AddUShortTag (M+$100D, 'ZoomStepCount'); - AddUShortTag (M+$100E, 'FocusStepCount'); - AddUShortTag (M+$100F, 'Sharpness', 1, '', rsOlympusSharpnessLkup); - AddUShortTag (M+$1010, 'FlashChargeLevel'); - AddUShortTag (M+$1011, 'ColorMatrix', 9); - AddUShortTag (M+$1012, 'BlackLevel', 4); - AddUShortTag (M+$1015, 'WhiteBalanceMode', 2); - AddUShortTag (M+$1017, 'RedBalance', 2); - AddUShortTag (M+$1018, 'BlueBalance', 2); - AddStringTag (M+$101A, 'SerialNumber'); - AddURationalTag(M+$1023, 'FlashBias'); - AddUShortTag (M+$1029, 'Contrast', 1, '', rsOlympusContrastLkup); - AddUShortTag (M+$102A, 'SharpnessFactor'); - AddUShortTag (M+$102B, 'ColorControl', 6); - AddUShortTag (M+$102C, 'ValidBits', 2); - AddUShortTag (M+$102D, 'CoringFilter'); - AddULongTag (M+$102E, 'FinalWidth'); - AddULongTag (M+$102F, 'FinalHeight'); - AddUShortTag (M+$1030, 'SceneDetect'); - AddULongTag (M+$1031, 'SceneArea', 8); - AddURationalTag(M+$1034, 'CompressionRatio'); - AddUShortTag (M+$1038, 'AFResult'); - AddUShortTag (M+$1039, 'CCDScanMode', 1, '', rsOlympusCCDScanModeLkup); - AddUShortTag (M+$103A, 'NoiseReduction', 1, '', rsOffOn); - AddUShortTag (M+$103B, 'FocusStepInfinity'); - AddUShortTag (M+$103C, 'FocusStepNear'); - AddSRationalTag(M+$103D, 'LightValueCenter'); - AddSRationalTag(M+$103E, 'LightValuePeriphery'); - AddIFDTag (M+$2010, 'Equipment', '', TSubIFDTag); - AddIFDTag (M+$2011, 'CameraSettings', '', TSubIFDTag); - - // Olympus Equipment Tags - AddBinaryTag (E+$0000, 'EquipmentVersion', 4, '', '', '', TVersionTag); - AddStringTag (E+$0100, 'CameraType', 6); - AddStringTag (E+$0101, 'SerialNumber', 32); - AddStringTag (E+$0102, 'InternalSerialNumber', 32); - AddURationalTag(E+$0103, 'FocalPlaneDiagonal'); - AddULongTag (E+$0104, 'BodyFirmwareVersion'); - AddByteTag (E+$0201, 'LensType', 6); - AddStringTag (E+$0202, 'LensSerialNumber', 32); - AddStringTag (E+$0203, 'LensModel'); - AddULongTag (E+$0204, 'LensFirmwareVersion'); - AddUShortTag (E+$0205, 'MaxApertureAtMinFocal'); - AddUShortTag (E+$0206, 'MaxApertureAtMaxFocal'); - AddUShortTag (E+$0207, 'MinFocalLength'); - AddUShortTag (E+$0208, 'MaxFocalLength'); - AddUShortTag (E+$020A, 'MaxAperture'); - AddUShortTag (E+$020B, 'LensProperties'); - AddByteTag (E+$0301, 'Extender', 6); - AddStringTag (E+$0302, 'ExtenderSerialNumber', 32); - AddStringTag (E+$0303, 'ExtenderModel'); - AddULongTag (E+$0304, 'ExtenderFirmwareVersion'); - AddStringTag (E+$0403, 'ConversionLens'); - AddUShortTag (E+$1000, 'FlashType', 1, '', rsOlympusFlashTypeLkup); - AddUShortTag (E+$1001, 'FlashModel', 1, '', rsOlympusFlashModelLkup); - AddULongTag (E+$1002, 'FlashFirmwareVersion'); - AddStringTag (E+$1003, 'FlashSerialNumber', 32); - - // Olympus camera settings tags - AddBinaryTag (C+$0000, 'CameraSettingsVersion', 4, '', '', '', TVersionTag); - AddULongTag (C+$0100, 'PreviewImageValid', 1, rsOlympusPreviewImgValid, rsOffOn); - AddULongTag (C+$0101, 'PreviewImageStart', 1, rsOlympusPreviewImgStart); - AddULongTag (C+$0102, 'PreviewImageLength', 1, rsOlympusPreviewImgLength); - - end; -end; - -// from dExif. -procedure BuildSanyoTagDefs(AList: TTagDefList); -begin - Assert(AList <> nil); - with AList do begin - AddULongTag (M+$0200, 'SpecialMode', 3, rsSanyoSpecialMode); - AddUShortTag (M+$0201, 'Quality', 1, rsQuality, rsSanyoQualityLkup); - AddUShortTag (M+$0202, 'Macro', 1, rsMacro, rsSanyoMacroLkup); - AddURationalTag(M+$0204, 'DigitalZoom', 1, rsDigitalZoom); - end; -end; - - -initialization - RegisterMakerNoteReader(TCanonMakerNoteReader, 'Canon', ''); - RegisterMakerNoteReader(TCanonMakerNoteReader, 'Casio', ''); - RegisterMakerNoteReader(TMinoltaMakerNoteReader, 'Minolta', ''); - RegisterMakerNoteReader(TOlympusMakerNoteReader, 'Olympus', ''); - end. diff --git a/components/fpexif/fpemakernotecanoncasio.pas b/components/fpexif/fpemakernotecanoncasio.pas new file mode 100644 index 000000000..2e2a888e1 --- /dev/null +++ b/components/fpexif/fpemakernotecanoncasio.pas @@ -0,0 +1,454 @@ +{ This maker note reader can handle CANON and CASIO cameras. } + +unit fpeMakerNoteCanonCasio; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, + fpeGlobal, fpeTags, fpeExifReadWrite; + +type + TCanonMakerNoteReader = class(TMakerNoteReader) + protected + function AddTag(AStream: TStream; const AIFDRecord: TIFDRecord; + const AData: TBytes; AParent: TTagID): Integer; override; + procedure GetTagDefs({%H-}AStream: TStream); override; + end; + + TCasioMakerNoteReader = class(TMakerNoteReader) + protected + FVersion: Integer; + procedure GetTagDefs({%H-}AStream: TStream); override; + function Prepare(AStream: TStream): Boolean; override; + end; + + +implementation + +uses + fpeStrConsts, fpeUtils, fpeExifData; + +resourcestring + // Canon + rsCanonAELkup = '0:Normal AE,1:Exposure compensation,2:AE lock,'+ + '3:AE lock + Exposure compensation,4:No AE'; + { + rsCanonAFLkup = '12288:None (MF),12289:Auto-selected,12290:Right,12291:Center,'+ + '12292:Left'; + } + rsCanonAFLkup = '$2005:Manual AF point selection,$3000:None (MF),' + + '$3001:Auto AF point selection,$3002:Right,$3003:Center,$3004:Left,' + + '$4001:Auto AF point selection,$4006:Face Detect'; + rsCanonAutoRotLkup = '0:None,1:Rotate 90 CW,2:Rotate 180,3:Rotate 270 CW'; + rsCanonBiasLkup = '65472:-2 EV,65484:-1.67 EV,65488:-1.50 EV,65492:-1.33 EV,'+ + '65504:-1 EV,65516:-0.67 EV,65520:-0.50 EV,65524:-0.33 EV,0:0 EV,'+ + '12:0.33 EV,16:0.50 EV,20:0.67 EV,32:1 EV,44:1.33 EV,48:1.50 EV,'+ + '52:1.67 EV,64:2 EV'; + rsCanonCamTypeLkup = '248:EOS High-end,250:Compact,252:EOS Mid-range,255:DV Camera'; + rsCanonEasyLkup = '0:Full Auto,1:Manual,2:Landscape,3:Fast Shutter,4:Slow Shutter,'+ + '5:Night,6:Gray scale,7:Sepia,8:Portrait,9:Sports,10:Macro,11:Black & White,'+ + '12:Pan Focus,13:Vivid,14:Neutral,15:Flash off,16:Long shutter,'+ + '17:Super macro,18:Foliage,19:Indoor,20:Fireworks,21:Beach,22:Underwater,'+ + '23:Snow,24:Kids & Pets,25:Night snapshot,26:Digital macro,27:My colors,'+ + '28:Movie snap,29:Super macro 2,30:Color accent,31:Color swap,32:Aquarium,'+ + '33:ISO3200,34:ISO6400,35:Creative light effect,36:Easy,37:Quick shot,'+ + '38:Creative auto,39:Zoom blur,40:Low light,41:Nostalgic,42:Super vivid,'+ + '43:Poster effect,44:Face self-timer,45:Smile,46:Wink self-timer,'+ + '47:Fisheye effect,48:Miniature effect,49:High-speed burst,'+ + '50:Best image selection,51:High dynamic range,52:Handheld night scene,'+ + '53:Movie digest,54:Live view control,55:Discreet,56:Blur reduction,'+ + '57:Monochrome,58:Toy camera effect,59:Scene intelligent auto,'+ + '60:High-speed burst HQ,61:Smooth skin,62:Soft focus,257:Spotlight,'+ + '258:Night 2,259:Night+,260:Super night,261:Sunset,263:Night scene,'+ + '264:Surface,265:Low light 2'; + rsCanonExposeLkup = '0:Easy shooting,1:Program AE,2:Shutter speed priority AE,'+ + '3:Aperture priority AE,4:Manual,5:Depth-of-field AE,6:M-Dep,7:Bulb'; + rsCanonFlashActLkup = '0:Did not fire,1:Fired'; + rsCanonFlashLkup = '0:Not fired,1:Auto,2:On,3:Red-eye,4:Slow sync,'+ + '5:Auto+red-eye,6:On+red eye,16:External flash'; + rsCanonFocalTypeLkup = '1:Fixed,2:Zoom'; + rsCanonFocTypeLkup = '0:Manual,1:Auto,3:Close-up (macro),8:Locked (pan mode)'; + rsCanonFocusLkup = '0:One-Shot AF,1:AI Servo AF,2:AI Focus AF,3:Manual focus,'+ + '4:Single,5:Continuous,6:Manual focus,16:Pan focus,256:AF+MF,'+ + '512:Movie snap focus,519:Movie servo AF'; + rsCanonGenLkup = '65535:Low,0:Normal,1:High'; + rsCanonImgStabLkup = '0:Off,1:On,2:Shoot only,3:Panning,4:Dynamic,256:Off,'+ + '257:On,258:Shoot only,259:Panning,260:Dynamic'; + rsCanonISOLkup = '0:Not used,15:auto,16:50,17:100,18:200,19:400'; + rsCanonMacroLkup = '1:Macro,2:Normal'; + rsCanonMeterLkup = '0:Default,1:Spot,2:Average,3:Evaluative,4:Partial,'+ + '5:Center-weighted average'; + rsCanonPanDirLkup = '0:Left to right,1:Right to left,2:Bottom to top,'+ + '3:Top to bottom,4:2x2 Matrix (clockwise)'; + rsCanonQualityLkup = '65535:n/a,1:Economy,2:Normal,3:Fine,4:RAW,5:Superfine,'+ + '130:Normal Movie,131:Movie (2)'; + rsCanonRecLkup = '1:JPEG,2:CRW+THM,3:AVI+THM,4:TIF,5:TIF+JPEG,6:CR2,'+ + '7:CR2+JPEG,9:MOV,10:MP4'; + rsCanonSizeLkup = '65535:n/a,0:Large,1:Medium,2:Small,4:5 MPixel,5:2 MPixel,'+ + '6:1.5 MPixel,8:Postcard,9:Widescreen,10:Medium widescreen,14:Small 1,'+ + '15:Small 2,16:Small 3,128:640x480 movie,129:Medium movie,130:Small movie,'+ + '137:128x720 movie,142:1920x1080 movie'; + rsCanonSloShuttLkup = '65535:n/a,0:Off,1:Night scene,2:On,3:None'; + rsCanonWhiteBalLkup = '0:Auto,1:Daylight,2:Cloudy,3:Tungsten,4:Flourescent,'+ + '5:Flash,6:Custom,7:Black & white,8:Shade,9:Manual temperature (Kelvin),'+ + '14:Daylight fluorescent,17:Under water'; + rsCanonZoomLkup = '0:None,1:2x,2:4x,3:Other'; + + // Casio + rsCasioAFMode2Lkup = '0:Off,1:Spot,2:Multi,3:Face detection,4:Tracking,5:Intelligent'; + rsCasioArtMode2Lkup = '0:Normal,8:Silent movie,39:HDR,45:Premium auto,' + + '47:Painting,49:Crayon drawing,51:Panorama,52:Art HDR,62:High Speed night shot,'+ + '64:Monochrome,67:Toy camera,68:Pop art,69:Light tone'; + rsCasioAutoIso2Lkup = '1:On,2:Off,7:On (high sensitivity),8:On (anti-shake),'+ + '10:High Speed'; + rsCasioCCDSensitivityLkup = '64:Normal,125:+1.0,250:+2.0,244:+3.0,80:Normal,'+ + '100:High'; + rsCasioColorFilter2Lkup = '0:Off,1:Blue,3:Green,4:Yellow,5:Red,6:Purple,7:Pink'; + rsCasioColorMode2Lkup = '0:Off,2:Black & White,3:Sepia'; + rsCasioDigitalZoomLkup = '$10000:Off,$10001:2x Digital zoom,'+ + '$20000:2x digital zoom,$40000:4x digital zoom'; + rsCasioDriveMode2Lkup = '0:Single shot,1:Continuous shooting,'+ + '2:Continuous (2 fps),3:Continuous (3 fps),4:Continuous (4 fps),'+ + '5:Continuous (5 fps),6:Continuous (6 fps),7:Continuous (7 fps),'+ + '10:Continuous (10 fps),12:Continuous (12 fps),15:Continuous (15 fps),'+ + '20:Continuous (20 fps),30:Continuous (30 fps),40:Continuous (40 fps),'+ + '60:Continuous (60 fps),240:Auto-N'; + rsCasioEnhancement2Lkup = '0:Off,1:Scenery,3:Green,5:Underwater,9:Flesh tones'; + rsCasioFlashIntensityLkup = '11:Weak,13:Normal,15:Strong'; + rsCasioFlashModeLkup = '1:Auto,2:On,3:Off,4:Red-eye reduction'; + rsCasioFocusingModeLkup = '2:Macro,3:Auto focus,4:Manual focus,5:Infinity'; + rsCasioFocusMode2Lkup = '0:Normal,1:Macro'; + rsCasioFocusMode22Lkup = '0:Manual,1:Focus lock,2:Macro,3:Single-area auto focus,'+ + '5:Infinity,6:Multi-area auto focus,8:Super macro'; + rsCasioImageSize2Lkup = '0:640 x 480,4:1600 x 1200,5:2048 x 1536,'+ + '20:2288 x 1712,21:2592 x 1944,22:2304 x 1728,36:3008 x 2008'; + rsCasioImageStabilization2Lkup = '0:Off,1:On,2:Best shot,3:Movie anti-shake'; + rsCasioISOSpeed2Lkup = '3 = 50,4:64,6:100,9:200'; + rsCasioLightingMode2Lkup = '0:Off,1:High dynamic range,5:Shadow enhance low,'+ + '6:Shadow enhance high'; + rsCasioPortraitRefiner2Lkup = '0:Off,1:+1,2:+2'; + rsCasioRecordingModeLkup = '1:Single shutter,2:Panorama,3:Night scene,'+ + '4:Portrait,5:Landscape'; + rsCasioRecordMode2Lkup = '2:Program AE,3:Shutter priority,4:Aperture priority,'+ + '5:Manual,6:Best shot,17:Movie,19:Movie (19),20:YouTube Movie'; + rsCasioReleaseMode2Lkup = '1:Normal,3:AE Bracketing,11:WB Bracketing,'+ + '13 = Contrast Bracketing,19:High Speed Burst'; + rsCasioSharpness2Lkup = '0:Soft,1:Normal,2:Hard'; + rsCasioSpecialEffectSetting2Lkup = '0:Off,1:Makeup,2:Mist removal,'+ + '3:Vivid landscape,16:Art shot'; + rsCasioVideoQuality2Lkup = '1:Standard,3:HD (720p),4:Full HD (1080p),5:Low'; + rsCasioWhiteBalanceLkup = '1:Auto,2:Tungsten,3:Daylight,4:Fluorescent,'+ + '5:Shade,129:Manual'; + rsCasioWhiteBalance2Lkup = '0:Auto,1:Daylight,2:Shade,3:Tungsten,4:Fluorescent,5:Manual'; + rsCasioWhiteBalance22Lkup = '0:Manual,1:Daylight,2:Cloudy,3:Shade,4:Flash?,'+ + '6:Fluorescent,9:Tungsten?,10:Tungsten,12:Flash'; + +const + M = DWord(TAGPARENT_MAKERNOTE); + +procedure BuildCanonTagDefs(AList: TTagDefList); +begin + Assert(AList <> nil); + with AList do begin + AddUShortTag(M+$0001, 'ExposureInfo1'); + AddUShortTag(M+$0002, 'Panorama'); + AddUShortTag(M+$0004, 'ExposureInfo2'); + AddStringTag(M+$0006, 'ImageType'); + AddStringTag(M+$0007, 'FirmwareVersion'); + AddULongTag (M+$0008, 'ImageNumber'); + AddStringTag(M+$0009, 'OwnerName'); + AddULongTag (M+$000C, 'CameraSerialNumber'); + AddUShortTag(M+$000F, 'CustomFunctions'); + end; +end; + +{ Casio Type 1 + Standard TIFF IFD Data using Casio Type 1 Tags but always uses + Motorola (Big-Endian) byte alignment + This makernote has no header - the IFD starts immediately + Ref.: http://www.ozhiker.com/electronics/pjmt/jpeg_info/casio_mn.html } +procedure BuildCasio1TagDefs(AList: TTagDefList); +begin + Assert(AList <> nil); + with AList do begin + AddUShortTag(M+$0001, 'RecordingMode', 1, '', rsCasioRecordingModeLkup); + AddUShortTag(M+$0002, 'Quality', 1, '', rsEconomyNormalFine1); + AddUShortTag(M+$0003, 'FocusingMode', 1, '', rsCasioFocusingModeLkup); + AddUShortTag(M+$0004, 'FlashMode', 1, '', rsCasioFlashModeLkup); + AddUShortTag(M+$0005, 'FlashIntensity', 1, '', rsCasioFlashIntensityLkup); + AddULongTag (M+$0006, 'ObjectDistance', 1, '', '', '%d mm'); + AddUShortTag(M+$0007, 'WhiteBalance', 1, '', rsCasioWhiteBalanceLkup); + AddULongTag (M+$000A, 'DigitalZoom', 1, '', rsCasioDigitalZoomLkup); + AddUShortTag(M+$000B, 'Sharpness', 1, '', rsNormalSoftHard); + AddUShortTag(M+$000C, 'Contrast', 1, '', rsNormalLowHigh); + AddUShortTag(M+$000D, 'Saturation', 1, '', rsNormalLowHigh); + AddUShortTag(M+$000A, 'DigitalZoom', 1, '', rsCasioDigitalZoomLkup); + AddUShortTag(M+$0014, 'CCDSensitivity', 1, '', rsCasioCCDSensitivityLkup); + end; +end; + +{ Case Type 2 + Header: 6 Bytes "QVC\x00\x00\x00" + IFD Data: Standard TIFF IFD Data using Casio Type 2 Tags but always uses + Motorola (Big-Endian) Byte Alignment. + All EXIF offsets are relative to the start of the TIFF header at the + beginning of the EXIF segment + Ref.: http://www.ozhiker.com/electronics/pjmt/jpeg_info/casio_mn.html + http://www.exiv2.org/tags-casio.html + https://sno.phy.queensu.ca/~phil/exiftool/TagNames/Casio.html#Type2 +} +procedure BuildCasio2TagDefs(AList: TTagDefList); +begin + Assert(AList <> nil); + with AList do begin + AddUShortTag (M+$0002, 'PreviewImageSize', 2); // width and height, in pixels + AddULongTag (M+$0003, 'PreviewImageLength'); + AddULongTag (M+$0004, 'PreviewImageStart'); + AddUShortTag (M+$0008, 'QualityMode', 1, '', rsEconomyNormalFine); + AddUShortTag (M+$0009, 'ImageSize', 1, '', rsCasioImageSize2Lkup); + AddUShortTag (M+$000D, 'FocusMode', 1, '', rsCasioFocusMode2Lkup); + AddUShortTag (M+$0014, 'ISOSpeed', 1, '', rsCasioISOSpeed2Lkup); + AddUShortTag (M+$0019, 'WhiteBalance', 1, '', rsCasioWhiteBalance2Lkup); + AddURationalTag(M+$001D, 'FocalLength'); + AddUShortTag (M+$001F, 'Saturation', 1, '', rsLowNormalHigh); + AddUShortTag (M+$0020, 'Contrast', 1, '', rsLowNormalHigh); + AddUShortTag (M+$0021, 'Sharpness', 1, '', rsCasioSharpness2Lkup); + AddBinaryTag (M+$0E00, 'PrintIM'); + AddBinaryTag (M+$2000, 'PreviewImage'); + AddStringTag (M+$2001, 'FirwareDate', 18); + AddUShortTag (M+$2011, 'WhiteBalanceBias', 2); + AddUShortTag (M+$2012, 'WhiteBalance2', 2, '', rsCasioWhiteBalance22Lkup); + AddUShortTag (M+$2021, 'AFPointPosition', 4); + AddULongTag (M+$2022, 'ObjectDistance'); + AddUShortTag (M+$2034, 'FlashDistance'); + AddByteTag (M+$2076, 'SpecialEffectMode', 3); // to do: array lkup - should be: '0 0 0' = Off,'1 0 0' = Makeup,'2 0 0' = Mist Removal,'3 0 0' = Vivid Landscape + AddBinaryTag (M+$2089, 'FaceInfo'); + AddByteTag (M+$211C, 'FacesDetected'); + AddUShortTag (M+$3000, 'RecordMode', 1, '', rsCasioRecordMode2Lkup); + AddUShortTag (M+$3001, 'ReleaseMode', 1, '', rsCasioReleaseMode2Lkup); + AddUShortTag (M+$3002, 'Quality', 1, '', rsEconomyNormalFine1); + AddUShortTag (M+$3003, 'FocusMode2', 1, '', rsCasioFocusMode2Lkup); + AddStringTag (M+$3006, 'HometownCity'); + AddUShortTag (M+$3007, 'BestShotMode'); // Lkup depends severly on camera model + AddUShortTag (M+$3008, 'AutoISO', 1, '', rsCasioAutoIso2Lkup); + AddUShortTag (M+$3009, 'AFMode', 1, '', rsCasioAFMode2Lkup); + AddBinaryTag (M+$3011, 'Sharpness2'); + AddBinaryTag (M+$3012, 'Contrast2'); + AddBinaryTag (M+$3013, 'Saturation2'); + AddUShortTag (M+$3014, 'ISO'); + AddUShortTag (M+$3015, 'ColorMode', 1, '', rsCasioColorMode2Lkup); + AddUShortTag (M+$3016, 'Enhancement', 1, '', rsCasioEnhancement2Lkup); + AddUShortTag (M+$3017, 'ColorFilter', 1, '', rsCasioColorFilter2Lkup); + AddUShortTag (M+$301B, 'ArtMode', 1, '', rsCasioArtMode2Lkup); + AddUShortTag (M+$301C, 'SequenceNumber'); + AddUShortTag (M+$301D, 'BracketSequence', 2); + AddUShortTag (M+$3020, 'ImageStabilization', 1, '', rsCasioImageStabilization2Lkup); + AddUShortTag (M+$302A, 'LightingMode', 1, '', rsCasioLightingMode2Lkup); + AddUShortTag (M+$302B, 'PortraitRefiner', 1, '', rsCasioPortraitRefiner2Lkup); + AddUShortTag (M+$3030, 'SpecialEffectLevel'); + AddUShortTag (M+$3031, 'SpecialEffectSetting', 1, '', rsCasioSpecialEffectSetting2Lkup); + AddUShortTag (M+$3103, 'DriveMode', 1, '', rsCasioDriveMode2Lkup); + AddBinaryTag (M+$310B, 'ArtModeParameters', 3); + AddUShortTag (M+$4001, 'CaptureFrameRate'); + AddUShortTag (M+$4003, 'VideoQuality', 1, '', rsCasioVideoQuality2Lkup); + + // to do... + end; +end; + + +//============================================================================== +// TCanonMakerNoteReader +//============================================================================== + +function TCanonMakerNoteReader.AddTag(AStream: TStream; + const AIFDRecord: TIFDRecord; const AData: TBytes; AParent: TTagID): Integer; +var + tagDef: TTagDef; + w: array of Word; + n,i: Integer; + t: TTagID; +begin + Result := -1; + + tagDef := FindTagDef(AIFDRecord.TagID or AParent); + if (tagDef = nil) then + exit; + + Result := inherited AddTag(AStream, AIFDRecord, AData, AParent); + + // We only handle 16-bit integer types here for further processing + if not (tagDef.TagType in [ttUInt16, ttSInt16]) then + exit; + + // Put binary data into a word array and fix endianness + n := Length(AData) div TagElementSize[ord(tagDef.TagType)]; + if n = 0 then + exit; + + if FBigEndian then + for i:=0 to n-1 do AData[i] := BEtoN(AData[i]) + else + for i:=0 to n-1 do AData[i] := LEtoN(AData[i]); + SetLength(w, n); + Move(AData[0], w[0], Length(AData)); + + // This is a special treatment of array tags which will be added as + // separate "MakerNote" tags. + t := AIFDRecord.TagID; + case AIFDRecord.TagID of + 1: // Exposure Info 1 + with FImgInfo.ExifData do begin + AddMakerNoteTag( 1, t, 'Macro mode', w[1], rsCanonMacroLkup); + if n = 2 then exit; + AddMakerNoteTag( 2, t, 'Self-timer', w[2]/10, '%2:.1f s'); + if n = 3 then exit; + AddMakerNoteTag( 3, t, 'Quality', w[3], rsCanonQualityLkup); + if n = 4 then exit; + AddMakerNoteTag( 4, t, 'Flash mode', w[4], rsCanonFlashLkup); + if n = 5 then exit; + AddMakerNoteTag( 5, t, 'Drive mode', w[5], rsSingleContinuous); + if n = 7 then exit; + AddMakerNoteTag( 7, t, 'Focus mode', w[7], rsCanonFocusLkup); + if n = 9 then exit; + AddMakerNoteTag( 9, t, 'Record mode', w[9], rsCanonRecLkup); + if n = 10 then exit; + AddMakerNoteTag(10, t, 'Image size', w[10], rsCanonSizeLkup); + if n = 11 then exit; + AddMakerNoteTag(11, t, 'Easy shoot', w[11], rsCanonEasyLkup); + if n = 12 then exit; + AddMakerNoteTag(12, t, 'Digital zoom', w[12], rsCanonZoomLkup); + if n = 13 then exit; + AddMakerNoteTag(13, t, 'Contrast', w[13], rsCanonGenLkup); + if n = 14 then exit; + AddMakerNoteTag(14, t, 'Saturation', w[14], rsCanonGenLkup); + if n = 15 then exit; + AddMakerNoteTag(15, t, 'Sharpness', w[15], rsCanonGenLkup); + if n = 16 then exit; + AddMakerNoteTag(16, t, 'CCD ISO', w[16], rsCanonISOLkup); + if n = 17 then exit; + AddMakerNoteTag(17, t, 'Metering mode', w[17], rsCanonMeterLkup); + if n = 18 then exit; + AddMakerNoteTag(18, t, 'Focus type', w[18], rsCanonFocTypeLkup); + if n = 19 then exit; + AddMakerNoteTag(19, t, 'AFPoint', w[19], rsCanonAFLkup); + if n = 20 then exit; + AddMakerNoteTag(20, t, 'Exposure mode', w[20], rsCanonExposeLkup); + if n = 24 then exit; + AddMakerNoteTag(24, t, 'Long focal', w[24]); + if n = 25 then exit; + AddMakerNoteTag(25, t, 'Short focal', w[25]); + if n = 26 then exit; + AddMakerNoteTag(26, t, 'Focal units', w[26]); + if n = 28 then exit; + AddMakerNoteTag(28, t, 'Flash activity', w[28], rsCanonFlashActLkup); + if n = 29 then exit; + AddMakerNoteTag(29, t, 'Flash details', w[29]); + if n = 32 then exit; + AddMakerNoteTag(32, t, 'Focus mode', w[32], rsSingleContinuous); + if n = 33 then exit; + AddMakerNoteTag(33, t, 'AESetting', w[33], rsCanonAELkup); + if n = 34 then exit; + AddMakerNoteTag(34, t, 'Image stabilization', w[34], rsSingleContinuous); + end; + 2: // Focal length + with FImgInfo.ExifData do begin + AddMakerNoteTag(0, t, 'FocalType', w[0], rsCanonFocalTypeLkup); + if n = 1 then exit; + AddMakerNoteTag(1, t, 'FocalLength', w[1]); + end; + 4: // ExposureInfo2 + with FImgInfo.ExifData do begin + if n = 7 then exit; + AddMakerNoteTag( 7, t, 'WhiteBalance', w[7], rsCanonWhiteBalLkup); + if n = 8 then exit; + AddMakerNoteTag( 8, t, 'Slow shutter', w[8], rsCanonSloShuttLkup); + if n = 9 then exit; + AddMakerNoteTag( 9, t, 'SequenceNumber', w[9]); + if n = 11 then exit; + AddMakerNoteTag(11, t, 'OpticalZoomStep', w[11]); + if n = 12 then exit; + AddMakerNoteTag(12, t, 'Camera temperature', w[12]); + if n = 14 then exit; + AddMakerNoteTag(14, t, 'AFPoint', w[14]); + if n = 15 then exit; + AddMakerNoteTag(15, t, 'FlashBias', w[15], rsCanonBiasLkup); + if n = 19 then exit; + AddMakerNoteTag(19, t, 'Distance', w[19]); + if n = 21 then exit; + AddMakerNoteTag(21, t, 'FNumber', w[21]); + if n = 22 then exit; + AddMakerNoteTag(22, t, 'Exposure time', w[22]); + if n = 23 then exit; + AddMakerNoteTag(23, t, 'Measured EV2', w[23]); + if n = 24 then exit; + AddMakerNoteTag(24, t, 'Bulb duration', w[24]); + if n = 26 then exit; + AddMakerNoteTag(26, t, 'Camera type', w[26], rsCanonCamTypeLkup); + if n = 27 then exit; + AddMakerNoteTag(27, t, 'Auto rotation', w[27], rsCanonAutoRotLkup); + if n = 28 then exit; + AddMakerNoteTag(28, t, 'NDFilter', w[28], rsCanonGenLkup); + end; + 5: // Panorma + with FImgInfo.ExifData do begin + if n = 2 then exit; + AddMakerNoteTag(2, t, 'Panorama frame number', w[2]); + if n = 5 then exit; + AddMakerNoteTag(5, t, 'Panorama direction', w[5], rsCanonPanDirLkup); + end; + end; +end; + +procedure TCanonMakerNoteReader.GetTagDefs(AStream: TStream); +begin + if Uppercase(FMake) = 'CANON' then + BuildCanonTagDefs(FTagDefs); +end; + + +//============================================================================== +// TCasioMakerNoteReader +//============================================================================== + +function TCasioMakerNoteReader.Prepare(AStream: TStream): Boolean; +var + p: Int64; + hdr: Array[0..5] of ansichar; +begin + Result := false; + + p := AStream.Position; + AStream.Read({%H-}hdr[0], SizeOf(hdr)); + if (hdr[0] = 'Q') and (hdr[1] = 'V') and (hdr[2] = 'C') and + (hdr[3] = #0) and (hdr[4] = #0) and (hdr[5] = #0) + then begin + FVersion := 2; + BuildCasio2TagDefs(FTagDefs); + AStream.Position := p + SizeOf(hdr); + end else + begin + FVersion := 1; + BuildCasio1TagDefs(FTagDefs); + AStream.Position := p; + end; + + FBigEndian := true; + Result := true; +end; + +procedure TCasioMakerNoteReader.GetTagDefs(AStream: TStream); +begin + if Uppercase(FMake) = 'CASIO' then + BuildCasio1TagDefs(FTagDefs); +end; + + +initialization + RegisterMakerNoteReader(TCanonMakerNoteReader, 'Canon;Casio', ''); + +end. + diff --git a/components/fpexif/fpemakernoteepson.pas b/components/fpexif/fpemakernoteepson.pas new file mode 100644 index 000000000..3b61e8457 --- /dev/null +++ b/components/fpexif/fpemakernoteepson.pas @@ -0,0 +1,50 @@ +unit fpeMakerNoteEpson; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, + fpeTags, fpeExifReadWrite; + +type + TEpsonMakerNoteReader = class(TMakerNoteReader) + protected + procedure GetTagDefs({%H-}AStream: TStream); override; + end; + +implementation + +procedure BuildEpsonTagDefs(AList: TTagDefList); +const + M = DWord(TAGPARENT_MAKERNOTE); +begin + Assert(AList <> nil); + with AList do begin + AddUShortTag(M+$0200, 'SpecialMode'); + AddUShortTag(M+$0201, 'JpegQuality'); + AddUShortTag(M+$0202, 'Macro'); + AddUShortTag(M+$0204, 'DigitalZoom'); + AddUShortTag(M+$0209, 'CameraID'); + AddStringTag(M+$020A, 'Comments'); + AddUShortTag(M+$020B, 'Width'); + AddUShortTag(M+$020C, 'Height'); + AddUShortTag(M+$020D, 'SoftRelease'); + end; +end; + +//============================================================================== +// TEpsonMakerNoteReader +//============================================================================== + +procedure TEpsonMakerNoteReader.GetTagDefs(AStream: TStream); +begin + BuildEpsonTagDefs(FTagDefs); +end; + +initialization + RegisterMakerNoteReader(TEpsonMakerNoteReader, 'Epson', ''); + +end. + diff --git a/components/fpexif/fpemakernotefuji.pas b/components/fpexif/fpemakernotefuji.pas new file mode 100644 index 000000000..a52e70cc8 --- /dev/null +++ b/components/fpexif/fpemakernotefuji.pas @@ -0,0 +1,142 @@ +unit fpeMakerNoteFuji; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, + fpeTags, fpeExifReadWrite; + +type + TFujiMakerNoteReader = class(TMakerNoteReader) + protected + procedure GetTagDefs({%H-}AStream: TStream); override; + end; + + +implementation + +uses + fpeStrConsts; + +resourcestring + rsFujiSharpnessLkup = '0:-4 (softest),1:-3 (very soft),2:-2 (soft),3:0 (normal),' + + '4:+2 (hard),5:+3 (very hard),6:+4 (hardest),130:-1 (medium soft),'+ + '132:+1 (medium hard),32768:Film Simulation,65535:n/a'; + rsFujiWhiteBalLkup = '0:Auto,256:Daylight,512:Cloudy,768:Daylight Fluorescent,' + + '769:Day White Fluorescent,770:White Fluorescent,771:Warm White Fluorescent,'+ + '772:Living Room Warm White Fluorescent,1024:Incandescent,1280:Flash,'+ + '1536:Underwater,3840:Custom,3841:Custom2,3842:Custom3,3843:Custom4,'+ + '3844:Custom5,4080:Kelvin'; + rsFujiSaturationLkup = '0:0 (normal),128:+1 (medium high),192:+3 (very high),'+ + '224:+4 (highest),256:+2 (high),384:-1 (medium low),512:Low,768:None (B&W),'+ + '769:B&W Red Filter,770:B&W Yellow Filter,771:B&W Green Filter,'+ + '784:B&W Sepia,1024:-2 (low),1216:-3 (very low),1248:-4 (lowest),'+ + '1280:Acros,1281:Acros Red Filter,1282:Acros Yellow Filter,'+ + '1283:Acros Green Filter,32768:Film Simulation'; + rsFujiContrastLkup = '0:Normal,128:Medium High,256:High,384:Medium Low,'+ + '512:Low,32768:Film Simulation'; + rsFujiContrastLkup1 = '0:Normal,256:High,768:Low'; + rsFujiNoiseReductionLkup = '64:Low,128:Normal,256:n/a'; + rsFujiHighIsoNoiseReductionLkup = '0:0 (normal),256:+2 (strong),'+ + '384:+1 (medium strong),448:+3 (very strong),480:+4 (strongest)'+ + '512:-2 (weak),640:-1 (medium weak),704:-3 (very weak),736:-4 (weakest)'; + rsFujiFlashModeLkup = '0:Auto,1:On,2:Off,3:Red-eye reduction,4:External,'+ + '16:Commander,32768:Not Attached,33056:TTL,38976:Manual,39040:Multi-flash,'+ + '43296:1st Curtain (front),51488:2nd Curtain (rear),59680:High Speed Sync (HSS)'; + rsFujiPictureModeLkup = '0:Auto,1:Portrait,2:Landscape,3:Macro,4:Sports,'+ + '5:Night Scene,6:Program AE,7:Natural Light,8:Anti-blur,9:Beach & Snow,'+ + '10:Sunset,11:Museum,12:Party,13:Flower,14:Text,15:Natural Light & Flash,'+ + '16:Beach,17:Snow,18:Fireworks,19:Underwater,20:Portrait with Skin Correction,'+ + '22:Panorama,23:Night (tripod),24:Pro Low-light,25:Pro Focus,26:Portrait 2,'+ + '27:Dog Face Detection,28:Cat Face Detection,64:Advanced Filter,'+ + '256:Aperture-priority AE,512:Shutter speed priority AE,768:Manual'; + rsFujiEXRModeLkup = '128:HR (High Resolution),512:SN (Signal to Noise priority),'+ + '768:DR (Dynamic Range priority)'; + rsFujiShadowHighlightLkup = '-64:+4 (hardest),-48:+3 (very hard),'+ + '-32:+2 (hard),-16:+1 (medium hard)'; + rsFujiShutterTypeLkup = '0:Mechanical,1:Electronic'; + rsFujiAutoBracketingLkup = '0:Off,1:On,2:No flash & flash'; + rsFujiPanoramaDirLkup = '1:Right,2:Up,3:Left,4:Down'; + rsFujiAdvancedFilterLkup = '65536:Pop Color,131072:Hi Key,196608:Toy Camera,'+ + '262144:Miniature, 327680:Dynamic Tone,327681:Partial Color Red,'+ + '327682:Partial Color Yellow,327683:Partial Color Green,'+ + '327684:Partial Color Blue,327685:Partial Color Orange,'+ + '327686:Partial Color Purple,458752:Soft Focus,589824:Low Key'; + rsFujiColorModeLkup = '0:Standard,16:Chrome,48:B & W'; + rsFujiBlurWarningLkup = '0:None,1:Blur Warning'; + rsFujiFocusWarningLkup = '0:Good,1:Out of focus'; + rsFujiExposureWarningLkup = '0:Good,1:Bad exposure'; + rsFujiDynamicRangeLkup = '1:Standard,3:Wide'; + rsFujiSceneRecognLkup = '0:Unrecognized,256:Portrait Image,512:Landscape Image,'+ + '768:Night Scene,1024:Macro'; + +procedure BuildFujiTagDefs(AList: TTagDefList); +const + M = DWord(TAGPARENT_MAKERNOTE); +begin + Assert(AList <> nil); + with AList do begin + AddBinaryTag (M+$0000, 'Version'); + AddStringTag (M+$1000, 'Quality'); + AddUShortTag (M+$1001, 'Sharpness', 1, '', rsFujiSharpnessLkup); + AddUShortTag (M+$1002, 'WhiteBalance', 1, '', rsFujiWhiteBalLkup); + AddUShortTag (M+$1003, 'Saturation', 1, '', rsFujiSaturationLkup); + AddUShortTag (M+$1004, 'Contrast', 1, '', rsFujiContrastLkup); + AddUShortTag (M+$1005, 'ColorTemperature'); + AddUShortTag (M+$1006, 'Contrast', 1, '', rsFujiContrastLkup1); + AddURationalTag(M+$100A, 'WhiteBalanceFineTune'); + AddUShortTag (M+$100B, 'NoiseReduction', 1, '', rsFujiNoiseReductionLkup); + AddUShortTag (M+$100E, 'HighISONoiseReduction', 1, '', rsFujiHighIsoNoiseReductionLkup); + AddUShortTag (M+$1010, 'FlashMode', 1, '', rsFujiFlashModeLkup); + AddURationalTag(M+$1011, 'FlashStrength'); + AddUShortTag (M+$1020, 'Macro', 1, '', rsOffOn); + AddUShortTag (M+$1021, 'FocusMode', 1, '', rsAutoManual); + AddUShortTag (M+$1030, 'SlowSync', 1, '', rsOffOn); + AddUShortTag (M+$1031, 'PictureMode', 1, '', rsFujiPictureModeLkup); + AddUShortTag (M+$1032, 'ExposureCount'); + AddUShortTag (M+$1033, 'EXRAuto', 1, '', rsAutoManual); + AddUShortTag (M+$1034, 'EXRMode', 1, '', rsFujiEXRModeLkup); + AddSLongTag (M+$1040, 'ShadowTone', 1, '', rsFujiShadowHighlightLkup); + AddSLongTag (M+$1041, 'HighlightTone', 1, '', rsFujiShadowHighlightLkup); + AddULongTag (M+$1044, 'DigitalZoom'); + AddUShortTag (M+$1050, 'ShutterType', 1, '', rsFujiShutterTypeLkup); + AddUShortTag (M+$1100, 'AutoBracketing', 1, '', rsFujiAutoBracketingLkup); + AddUShortTag (M+$1101, 'SequenceNumber'); + AddUShortTag (M+$1153, 'PanoramaAngle'); + AddUShortTag (M+$1154, 'PanoramaDirection', 1, '', rsFujiPanoramaDirLkup); + AddULongTag (M+$1201, 'AdvancedFilter', 1, '', rsFujiAdvancedFilterLkup); + AddUShortTag (M+$1210, 'ColorMode', 1, '', rsFujiColorModeLkup); + AddUShortTag (M+$1300, 'BlurWarning', 1, '', rsFujiBlurWarningLkup); + AddUShortTag (M+$1301, 'FocusWarning', 1, '', rsFujiFocusWarningLkup); + AddUShortTag (M+$1302, 'ExposureWarning', 1, '', rsFujiExposureWarningLkup); + AddUShortTag (M+$1400, 'DynamicRange', 1, '', rsFujiDynamicRangeLkup); + AddURationalTag(M+$1404, 'MinFocalLength'); + AddURationalTag(M+$1405, 'MaxFocalLength'); + AddURationalTag(M+$1406, 'MaxApertureAtMinFocal'); + AddURationalTag(M+$1407, 'MaxApertureAtMaxFocal'); + AddUShortTag (M+$140B, 'AutoDynamicRange'); + AddUShortTag (M+$1422, 'ImageStabilization', 3); + AddUShortTag (M+$1425, 'SceneRecognition', 1, '', rsFujiSceneRecognLkup); + AddUShortTag (M+$1431, 'Rating'); + AddStringTag (M+$8000, 'FileSource'); + AddULongTag (M+$8002, 'OrderNumber'); + AddUShortTag (M+$8003, 'FrameNumber'); + end; +end; + +//============================================================================== +// TFujiMakerNoteReader +//============================================================================== + +procedure TFujiMakerNoteReader.GetTagDefs(AStream: TStream); +begin + BuildFujiTagDefs(FTagDefs); +end; + +initialization + RegisterMakerNoteReader(TFujiMakerNoteReader, 'Fuji', ''); + +end. + diff --git a/components/fpexif/fpemakernoteminolta.pas b/components/fpexif/fpemakernoteminolta.pas new file mode 100644 index 000000000..e50be6aad --- /dev/null +++ b/components/fpexif/fpemakernoteminolta.pas @@ -0,0 +1,243 @@ +unit fpeMakerNoteMinolta; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, + fpeGlobal, fpeTags, fpeExifReadWrite; + +type + TMinoltaMakerNoteReader = class(TMakerNoteReader) + protected + function AddTag(AStream: TStream; const AIFDRecord: TIFDRecord; + const AData: TBytes; AParent: TTagID): Integer; override; + procedure GetTagDefs({%H-}AStream: TStream); override; + end; + + +implementation + +uses + fpeStrConsts, fpeUtils, fpeExifData; + +resourcestring + // Minolta + rsMinoltaBracketStepLkup = '0:1/3 EV,1:2/3 EV,2:1 EV'; + rsMinoltaColorModeLkup = '0:Natural color,1:Black & White,2:Vivid color,'+ + '3:Solarization,4:Adobe RGB,5:Sepia,9:Natural,12:Portrait,13:Natural sRGB,'+ + '14:Natural+ sRGB,15:Landscape,16:Evening,17:Night Scene,18:Night Portrait,'+ + '132:Embed Adobe RGB'; + rsMinoltaColorProfileLkup = '0:Not embedded,1:Embedded'; + rsMinoltaDataImprintLkup = '0;None,1:YYYY/MM/DD,2:MM/DD/HH:MM,3:Text,4:Text + ID#'; + rsMinoltaDECPositionLkup = '0:Exposure,1:Contrast,2:Saturation,3:Filter'; + rsMinoltaDigitalZoomLkup = '0:Off,1:Electronic magnification,2:2x'; + rsMinoltaDriveModeLkup = '0:Single,1:Continuous,2:Self-timer,4:Bracketing,'+ + '5:Interval,6:UHS continuous,7:HS continuous'; + rsMinoltaExposureModeLkup = '0:Program,1:Aperture priority,2:Shutter priority,3:Manual'; + rsMinoltaFocusAreaLkup = '0:Wide Focus (normal),1:Spot Focus'; + rsMinoltaFlashMeteringLkup = '0:ADI (Advanced Distance Integration),1:Pre-flash TTL,2:Manual flash control'; + rsMinoltaFlashModeLkup = '0:Fill flash,1:Red-eye reduction,2:Rear flash sync,3:Wireless,4:Off?'; + rsMinoltaFocusModeLkup = '0:AF,1:MF'; + rsMinoltaFolderNameLkup = '0:Standard Form,1:Data Form'; + rsMinoltaImageSizeLkup = '1:1600x1200,2:1280x960,3:640x480,5:2560x1920,6:2272x1704,7:2048x1536'; + rsMinoltaImageSizeLkup1 = '0:Full,1:1600x1200,2:1280x960,3:640x480,6:2080x1560,7:2560x1920,8;3264x2176'; + rsMinoltaImageStabLkup = '1:Off,5:On'; + rsMinoltaInternalFlashLkup = '0:No,1:Fired'; + rsMinoltaIntervalModeLkup = '0:Still image,1:Time-lapse movie'; + rsMinoltaIsoSettingLkup = '0:100,1:200,2:400,3:800,4:Auto,5:64'; + rsMinoltaMeteringModeLkup = '0:Multi-segment,1:Center-weighted average,2:Spot'; + rsMinoltaModelIDLkup = '0:DiMAGE 7/X1/X21 or X31,1:DiMAGE 5,2:DiMAGE S304,'+ + '3:DiMAGE S404,4:DiMAGE 7i,5:DiMAGE 7Hi,6:DiMAGE A1,7:DiMAGE A2 or S414'; + rsMinoltaQualityLkup = '0:Raw,1:Super Fine,2:Fine,3:Standard,4:Economy,5:Extra fine'; + rsMinoltaSceneModeLkup = '0:Standard,1:Portrait,2:Text,3:Night Scene,'+ + '4:Sunset,5:Sports,6:Landscape,7:Night Portrait,8:Macro,9:Super Macro,'+ + '16:Auto,17:Night View/Portrait,18:Sweep Panorama,19:Handheld Night Shot,'+ + '20:Anti Motion Blur,21:Cont. Priority AE,22:Auto+,23:3D Sweep Panorama,'+ + '24:Superior Auto,25:High Sensitivity,26:Fireworks,27:Food,28:Pet,33:HDR,'+ + '65535:n/a'; + rsMinoltaSharpnessLkup = '0:Hard,1:Normal,2:Soft'; + rsMinoltaSubjectProgramLkup = '0:None,1:Portrait,2:Text,3:Night portrait,4:Sunset,5:Sports action'; + rsMinoltaTeleconverterLkup = '$0:None,$4:Minolta/Sony AF 1.4x APO (D) (0x04),'+ + '$5:Minolta/Sony AF 2x APO (D) (0x05),$48 = Minolta/Sony AF 2x APO (D),'+ + '$50:Minolta AF 2x APO II,$60:Minolta AF 2x APO,$88:Minolta/Sony AF 1.4x APO (D),'+ + '$90 = Minolta AF 1.4x APO II,$A0 = Minolta AF 1.4x APO'; + rsMinoltaWhiteBalanceLkup = '$00:Auto,$01:Color Temperature/Color Filter,$10:Daylight,'+ + '$20:Cloudy,$30:Shade,$40:Tungsten,$50:Flash,$60:Fluorescent,$70:Custom'; + rsMinoltaWideFocusZoneLkup = '0:No zone,1:Center zone (horizontal orientation),'+ + '2:Center zone (vertical orientation),3:Left zone,4:Right zone'; + rsMinoltaZoneMatchingLkup = '0:ISO Setting Used,1:High Key,2:Low Key'; + +{ The Minolta MakerNote can be quite long, about 12 kB. In the beginning + of this tag there is a normal tag directory in usual format. + References: + - http://www.dalibor.cz/software/minolta-makernote + - https://sno.phy.queensu.ca/~phil/exiftool/TagNames/Minolta.html } +procedure BuildMinoltaTagDefs(AList: TTagDefList); +const + M = DWord(TAGPARENT_MAKERNOTE); +begin + Assert(AList <> nil); + with AList do begin + { This tag stores the string 'MLT0', not zero-terminated, as an identifier } + AddBinaryTag (M+$0000, 'Version', 4, '', '', '', TVersionTag); + + { Stores all settings which were in effect when taking the picture. + Details depend on camera. } + AddBinaryTag (M+$0001, 'MinoltaCameraSettingsOld'); // Camera D5, D7, S304, S404 + AddBinaryTag (M+$0003, 'MinoltaCameraSettings'); // Camera D7u, D7i, D7Hi + + // this is the size of the JPEG (compressed) or TIFF or RAW file. + AddULongTag (M+$0040, 'CompressedImageSize'); + + { Stores the thumbnail image (640×480). It is in normal JFIF format but the + first byte should be changed to 0xFF. Beware! Sometimes the thumbnail + is not stored in the file and this tag points beyond the end of the file. } + AddBinaryTag (M+$0081, 'ReviewImage'); + + { The cameras D7u, D7i and D7Hi no longer store the thumbnail inside the tag. + It has instead two tags describing the position of the thumbnail in the + file and its size } + AddULongTag (M+$0088, 'PreviewImageStart'); + AddULongTag (M+$0089, 'PreviewImageLength'); + + AddULongTag (M+$0100, 'SceneMode', 1, '', rsMinoltaSceneModeLkup); + AddULongTag (M+$0101, 'ColorMode', 1, '', rsMinoltaColorModeLkup); + AddULongtag (M+$0102, 'Quality', 1, '', rsMinoltaQualityLkup); + AddULongTag (M+$0103, 'ImageSize', 1, '', rsMinoltaImageSizeLkup); + AddSRationalTag(M+$0104, 'FlashExposureComp'); + AddULongTag (M+$0105, 'TeleConverter', 1, '', rsMinoltaTeleconverterLkup); + AddULongTag (M+$0107, 'ImageStabilization', 1, '', rsMinoltaImageStabLkup); + AddULongTag (M+$0109, 'RawAndJpegRecording', 1, '', rsOffOn); + AddULongTag (M+$010A, 'ZoneMatching', 1, '', rsMinoltaZoneMatchingLkup); + AddULongTag (M+$010B, 'ColorTemperature', 1); + AddULongTag (M+$010C, 'LensType', 1); + AddSLongTag (M+$0111, 'ColorCompensationFilter', 1); + AddULongTag (M+$0112, 'WhiteBalanceFileTune', 1); + AddULongTag (M+$0113, 'ImageStabilization', 1, '', rsOffOn); + AddULongTag (M+$0115, 'WhiteBalance', 1, '', rsMinoltaWhiteBalanceLkup); + AddBinaryTag (M+$0E00, 'PrintPIM'); + end; +end; + + +//============================================================================== +// TMinoltaMakerNoteReader +//============================================================================== + +function TMinoltaMakerNoteReader.AddTag(AStream: TStream; + const AIFDRecord: TIFDRecord; const AData: TBytes; AParent: TTagID): Integer; +var + tagDef: TTagDef; + v: array of DWord; + n, i: Integer; + t: TTagID; + d: Integer; + isDiMAGE7Hi: Boolean; + //p: PByte; +begin + Result := -1; + + tagDef := FindTagDef(AIFDRecord.TagID or AParent); + if (tagDef = nil) then + exit; + + Result := inherited AddTag(AStream, AIFDRecord, AData, AParent); + + // This is a special treatment of array tags which will be added as + // separate "MakerNote" tags. + // Ref: https://sno.phy.queensu.ca/~phil/exiftool/TagNames/Minolta.html#CameraSettings + t := AIFDRecord.TagID; + case AIFDRecord.TagID of + $0001, + $0003: // Minolta camera settings tags + // Contains an array of ULong values encoded in big-endian style, + // regardless of the byte order in the picture (i.e., even if the + // JPEG or TIFF itself is little-endian). + begin + // Put binary data into a DWord array and fix endianness + // ASSUMING HERE THAT DATA ARE ULONG HERE! + n := Length(AData) div TagElementSize[ord(ttUInt32)]; + SetLength(v, n); + Move(AData[0], v[0], Length(AData)); + for i:=0 to n-1 do + v[i] := BEtoN(v[i]); + // Fix problem with DiMAGE7Hi (http://www.dalibor.cz/software/minolta-makernote) + isDiMAGE7Hi := FModel = 'DiMAGE7Hi'; + if isDiMAGE7Hi then d := 1 else d := 0; + with FImgInfo.ExifData do begin + AddMakerNoteTag( 1, t, 'Exposure mode', v[1], rsMinoltaExposureModeLkup, '', ttUInt32); + AddMakerNoteTag( 2, t, 'Flash mode', v[2], rsMinoltaFlashModeLkup, '', ttUInt32); + AddMakerNoteTag( 3, t, 'White balance', v[3], '', '', ttUInt32); + AddMakerNoteTag( 4, t, 'Minolta image size', v[4], rsMinoltaImageSizeLkup1, '', ttUInt32); + AddMakerNoteTag( 5, t, 'Minolta quality', v[5], rsMinoltaQualityLkup, '', ttUInt32); + AddMakerNoteTag( 6, t, 'Drive mode', v[6], rsMinoltaDriveModeLkup, '', ttUInt32); + AddMakerNoteTag( 7, t, 'Metering mode', v[7], rsMinoltaMeteringModeLkup, '', ttUInt32); + AddMakerNoteTag( 8, t, 'ISO', v[8], '', '', ttUInt32); + AddMakerNoteTag( 9, t, 'Exposure time', v[9], '', '', ttUInt32); + AddMakerNoteTag(10, t, 'F number', v[10], '', '', ttUInt32); + AddMakerNoteTag(11, t, 'Macro mode', v[11], rsOffOn, '', ttUInt32); + AddMakerNoteTag(12, t, 'Digital zoom', v[12], rsMinoltaDigitalZoomLkup, '', ttUInt32); + AddMakerNoteTag(13, t, 'Exposure compensation', v[13], '', '', ttUInt32); + AddMakerNoteTag(14, t, 'Bracket step', v[14], rsMinoltaBracketStepLkup, '', ttUInt32); + AddMakerNoteTag(16, t, 'Interval length', v[16], '', '', ttUInt32); + AddMakerNoteTag(17, t, 'Interval number', v[17], '', '', ttUInt32); + AddMakerNoteTag(18, t, 'Focal length', v[18], '', '', ttUInt32); // crashes + AddMakerNoteTag(19, t, 'Focus distance', v[19], '', '', ttUInt32); + AddMakerNoteTag(20, t, 'Flash fired', v[20], rsNoYes, '', ttUInt32); + AddMakerNoteTag(21, t, 'Minolta date', v[21], '', '', ttUInt32); + AddMakerNoteTag(22, t, 'Minolta time', v[22], '', '', ttUInt32); + AddMakerNoteTag(23, t, 'Max aperture', v[23], '', '', ttUInt32); + AddMakerNoteTag(26, t, 'File number memory', v[26], rsOffOn, '', ttUInt32); + AddMakerNoteTag(27, t, 'Last file number', v[27], '', '', ttUInt32); + AddMakerNoteTag(28, t, 'Color balance red', v[28], '', '', ttUInt32); + AddMakerNoteTag(29, t, 'Color balance green', v[29], '', '', ttUInt32); + AddMakerNoteTag(30, t, 'Color balance blue', v[30], '', '', ttUInt32); + AddMakerNoteTag(31, t, 'Saturation', v[31], '', '', ttUInt32); + AddMakerNoteTag(32, t, 'Contrast', v[32], '', '', ttUInt32); + AddMakerNoteTag(33, t, 'Sharpness', v[33], rsMinoltaSharpnessLkup, '', ttUInt32); + AddMakerNoteTag(34, t, 'Subject program', v[34], rsMinoltaSubjectProgramLkup, '', ttUInt32); + AddMakerNoteTag(35, t, 'Flash exposure compensation', v[35], '', '', ttUInt32); + AddMakerNoteTag(36, t, 'AE setting', v[36], rsMinoltaIsoSettingLkup, '', ttUInt32); + AddMakerNoteTag(37, t, 'Minolta model ID', v[37], rsMinoltaModelIDLkup, '', ttUInt32); + AddMakerNoteTag(38, t, 'Interval mode', v[38], rsMinoltaIntervalModeLkup, '', ttUInt32); + AddMakerNoteTag(39, t, 'Folder name', v[39], rsMinoltaFolderNameLkup, '', ttUInt32); + AddMakerNoteTag(40, t, 'Color mode', v[40], rsMinoltaColorModeLkup, '', ttUInt32); + AddMakerNoteTag(41, t, 'Color filter', v[41], '', '', ttUInt32); + AddMakerNoteTag(42, t, 'BW filter', v[42], '', '', ttUInt32); + AddMakerNoteTag(43, t, 'Internal flash', v[43], rsMinoltaInternalFlashLkup, '', ttUInt32); + AddMakerNoteTag(44, t, 'Brightness', v[44], '', '', ttUInt32); + AddMakerNoteTag(45, t, 'Spot focus point X', v[45], '', '', ttUInt32); + AddMakerNoteTag(46, t, 'Spot focus point Y', v[46], '', '', ttUInt32); + AddMakerNoteTag(47, t, 'Wide focus zone', v[47], rsMinoltaWideFocusZoneLkup, '', ttUInt32); + AddMakerNoteTag(48, t, 'Focus mode', v[48], rsMinoltaFocusModeLkup, '', ttUInt32); + AddMakerNoteTag(49, t, 'Focus area', v[49], rsMinoltaFocusAreaLkup, '', ttUInt32); + AddMakerNoteTag(40, t, 'DEC position', v[50], rsMinoltaDECPositionLkup, '', ttUInt32); + if isDiMAGE7Hi then + AddMakerNoteTag(51, t, 'Color profile', v[51], rsMinoltaColorProfileLkup, '', ttUInt32); + AddMakerNoteTag(51+d, t, 'Data imprint', v[52], rsMinoltaDataImprintLkup, '', ttUInt32); + AddMakerNoteTag(63+d, t, 'Flash metering', v[63], rsMinoltaFlashMeteringLkup, '', ttUInt32); // or is the index 53? + end; + end; + $0010: // CameraInfoA100 + begin + //p := @AData[0]; + //... conversion stopped due to unclear documentation on + // https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Minolta.html#CameraInfoA100 + // --- Is there an index 0? + end; + end; +end; + +procedure TMinoltaMakerNoteReader.GetTagDefs(AStream: TStream); +begin + BuildMinoltaTagDefs(FTagDefs) +end; + + +initialization + RegisterMakerNoteReader(TMinoltaMakerNoteReader, 'Minolta', ''); + +end. + diff --git a/components/fpexif/fpemakernotenikon.pas b/components/fpexif/fpemakernotenikon.pas new file mode 100644 index 000000000..3b8d12f4b --- /dev/null +++ b/components/fpexif/fpemakernotenikon.pas @@ -0,0 +1,519 @@ +unit fpeMakerNoteNikon; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, + fpeGlobal, fpeTags, fpeExifReadWrite; + +type + TNikonMakerNoteReader = class(TMakerNoteReader) + protected + function AddTag(AStream: TStream; const AIFDRecord: TIFDRecord; + const AData: TBytes; AParent: TTagID): Integer; override; + procedure GetTagDefs(AStream: TStream); override; + function Prepare(AStream: TStream): Boolean; override; + end; + + TNikonCropHiSpeedTag = class(TIntegerTag) + public + function GetAsString: String; override; + end; + + TNikonLensTypeTag = class(TIntegerTag) + public + function GetAsString: string; override; + end; + + TNikonLensTag = class(TFloatTag) + public + function GetAsString: string; override; + end; + + TNikonShootingModeTag = class(TIntegerTag) + public + function GetAsString: String; override; + end; + + TNikonNEFBitDepthTag = class(TIntegerTag) + public + function GetAsString: String; override; + end; + + +implementation + +uses + Math, + fpeStrConsts, fpeUtils, fpeExifData; + +resourcestring + rsNikonActiveDLightingLkUp = '0:Off,1:Low,3:Normal,5:High,7:Extra High,'+ + '8:Extra High 1,9:Extra High 2,10:Extra High 3,11:Extra High 4,65535:Auto'; + rsNikonAFAreaMode = '0:Single Area,1:Dynamic Area,2:Dynamic Area (closest subject),'+ + '3:Group Dynamic,4:Single Area (wide),5:Dynamic Area (wide)'; + rsNikonAFPoint = '0:Center,1:Top,2:Bottom,3:Mid-left,4:Mid-right,5:Upper-left,'+ + '6:Upper-right,7:Lower-left,8:Lower-right,9:Far Left,10:Far Right'; + rsNikonAFPointsInFocus = '0:(none),$7FF:All 11 points,1:Center,2:Top,4:Bottom,'+ + '8:Mid-left,16:Mid-right,32:Upper-left,64:Upper-right,128:Lower-left,'+ + '256:Lower-right,512:Far left,1024:Far right'; + // To do: This is a bit-mask. Combinations should be calculated! + rsNikonColorModeLkup = '1:Color,2:Monochrome'; + rsNikonColorSpaceLkup = '1:sRGB,2:Adobe RGB'; + rsNikonConverterLkup = '0:Not used,1:Used'; + rsNikonCropHiSpeedLkup = '0:Off,1:1.3x Crop,2:DX Crop,3:5/4 Crop,4:3/2 Crop,'+ + '6:16/9 Crop,9:DX Movie Crop,11:FX Uncropped,12:DX Uncropped,17:1/1 Crop'; + rsNikonCropHiSpeedMask = '%0:s (%1:dx%2:d cropped to %3:dx%4:d at pixel %5:d,%6:d)'; + rsNikonDateDisplayFormat = '0:Y/M/D,1:M/D/Y,2:D/M/Y'; + rsNikonFlashModeLkUp = '0:Did Not Fire,1:Fired, Manual,3:Not Ready,'+ + '7:Fired External,8:Fired Commander Mode,9:Fired TTL Mode'; + rsNikonHighISONoiseReductionLkUp = '0:Off,1:Minimal,2:Low,3:Medium Low,'+ + '4:Normal,5:Medium High,6:High'; + rsNikonImgAdjLkup = '0:Normal,1:Bright+,2:Bright-,3:Contrast+,4:Contrast-'; + rsNikonISOLkup = '0:ISO80,2:ISO160,4:ISO320,5:ISO100'; + rsNikonNEFCompressionLkUp = '1:Lossy (type 1),2: Uncompressed,3:Lossless,'+ + '4:Lossy (type 2),5:Striped packed 12 bits,6:Uncompressed (reduced to 12 bit),'+ + '7:Unpacked 12 bits,8:Small,9:Packed 12 bits'; + rsNikonOffOn='-1:Off,1:On'; + rsNikonQualityLkup = '1:Vga Basic,2:Vga Normal,3:Vga Fine,4:SXGA Basic,'+ + '5:SXGA Normal,6:SXGA Fine,10:2 Mpixel Basic,11:2 Mpixel Normal,'+ + '12:2 Mpixel Fine'; + rsNikonRetoucheHistoryLkup = '0:None,3:B & W,4:Sepia,5:Trim,6:Small Picture,'+ + '7:D-Lighting,8:Red Eye,9:Cyanotype,10:Sky Light,11:Warm Tone,'+ + '12:Color Custom,13:Image Overlay,14:Red Intensifier,15:Green Intensifier,'+ + '16:Blue Intensifier,17:Cross Screen,18:Quick Retouch,19:NEF Processing,'+ + '23:Distortion Control,25:Fisheye,26:Straighten,29:Perspective Control,'+ + '30:Color Outline,31:Soft Filter,32:Resize,33: Miniature Effect,'+ + '34:Skin Softening,35:Selected Frame,37:Color Sketch,38:Selective Color,'+ + '39:Glamour,40:Drawing,44:Pop,45:Toy Camera Effect 1,46:Toy Camera Effect 2,'+ + '47:Cross Process (red),48:Cross Process (blue),49:Cross Process (green),'+ + '50:Cross Process (yellow),51:Super Vivid,52:High-contrast Monochrome,'+ + '53:High Key,54:Low Key'; + rsNikonShutterModeLkUp = '0:Mechanical,16:Electronic,48:Electronic Front Curtain'; + rsNikonVignetteControlLkUp = '0:Off,1:Low,3:Normal,5:High'; + rsNikonVibrationReductionLkUp = '0:n/a,1:On,2:Off'; + rsNikonVRModeLkUp = '0:Normal,1:On (1),2:Active,3:Sport'; + rsNikonWhiteBalanceLkup = '0:Auto,1:Preset,2:Daylight,3:Incandescense,'+ + '4:Fluorescence,5:Cloudy,6:SpeedLight'; + +const + M = DWord(TAGPARENT_MAKERNOTE); + +// not tested +procedure BuildNikon1TagDefs(AList: TTagDefList); +begin + Assert(AList <> nil); + with AList do begin + AddUShortTag(M+$0002, 'FamilyID'); + AddUShortTag(M+$0003, 'Quality', 1, '', rsNikonQualityLkup); + AddUShortTag(M+$0004, 'ColorMode', 1, '', rsNikonColorModeLkup); + AddUShortTag(M+$0005, 'ImageAdjustment', 1, '', rsNikonImgAdjLkup); + AddUShortTag(M+$0006, 'ISOSpeed', 1, '', rsNikonISOLkup); + AddUShortTag(M+$0007, 'WhiteBalance', 1, '', rsNikonWhiteBalanceLkup); + AddUShortTag(M+$0008, 'Focus'); + AddUShortTag(M+$000A, 'DigitalZoom'); + AddUShortTag(M+$000B, 'Converter', 1, '', rsNikonConverterLkup); + end; +end; + +{ for Nikon D1, E880, E885, E990, E995, E2500, E5000 + Ref http://www.tawbaware.com/990exif.htm + https://sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html } +procedure BuildNikon2TagDefs(AList: TTagDefList); +begin + Assert(AList <> nil); + with AList do begin + AddBinaryTag (M+$0001, 'Version', 4, '', '', '', TVersionTag); + AddUShortTag (M+$0002, 'ISO', 2); + AddStringTag (M+$0003, 'ColorMode'); + AddStringTag (M+$0004, 'Quality'); + AddStringTag (M+$0005, 'WhiteBalance'); + AddStringtag (M+$0006, 'ImageSharpening'); + AddStringTag (M+$0007, 'FocusMode'); + AddStringTag (M+$0008, 'FlashSetting'); + AddStringTag (M+$0009, 'FlashType'); + AddURationalTag(M+$000A, 'UNKNOWN'); + AddStringTag (M+$000F, 'ISOSelection'); + AddStringTag (M+$0080, 'ImageAdjustment'); + AddStringTag (M+$0081, 'ToneComp'); + AddStringTag (M+$0082, 'AuxiliaryLens'); + AddURationalTag(M+$0085, 'ManualFocusDistance'); + AddURationalTag(M+$0086, 'DigitalZoom'); + AddBinaryTag (M+$0088, 'AFInfo'); + AddStringTag (M+$008D, 'ColorHue'); + AddStringTag (M+$008F, 'SceneMode'); + AddStringTag (M+$0090, 'LightSource'); + AddBinaryTag (M+$0010, 'DataDump'); + end; +end; + +// Ref.: https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html +procedure BuildNikon3TagDefs(AList: TTagDefList); +begin + Assert(AList <> nil); + with AList do begin + // Tags in main MakerNote IFD + AddBinaryTag (M+$0001, 'Version', 4, '', '', '', TVersionTag); + AddUShortTag (M+$0002, 'ISO', 2); + AddStringTag (M+$0003, 'ColorMode'); + AddStringTag (M+$0004, 'Quality'); + AddStringTag (M+$0005, 'WhiteBalance'); + AddStringtag (M+$0006, 'Sharpness'); + AddStringTag (M+$0007, 'FocusMode'); + AddStringTag (M+$0008, 'FlashSetting'); + AddStringTag (M+$0009, 'FlashType'); + AddURationalTag(M+$000A, 'UNKNOWN'); + AddSShortTag (M+$000B, 'WhiteBalanceFineTune'); + AddURationalTag(M+$000C, 'WB_RBLevels', 4); + AddBinaryTag (M+$000D, 'ProgramShift', 1); + AddBinaryTag (M+$000E, 'ExposureDifference', 1); + AddBinaryTag (M+$000F, 'ISOSelection'); + AddBinaryTag (M+$0010, 'DataDump'); + // ... + AddBinaryTag (M+$0012, 'FlashExposureComp', 4); + AddUShortTag (M+$0013, 'ISO Setting', 2); + AddUShortTag (M+$0016, 'ImageBoundary', 4); + AddBinaryTag (M+$0017, 'ExternalFlashExposureComp', 4); + AddBinaryTag (M+$0018, 'FlashExposureBracketValue', 4); + AddSRationalTag(M+$0019, 'ExposureBracketValue'); + AddStringTag (M+$001A, 'ImageProcessing'); + AddUShortTag (M+$001B, 'CropHiSpeed', 7, '', rsNikonCropHiSpeedLkUp, '', TNikonCropHiSpeedTag); + AddBinaryTag (M+$001C, 'ExposureTuning', 3); + AddStringTag (M+$001D, 'SerialNumber', 1, '', '', nil, true); + AddUShortTag (M+$001E, 'ColorSpace', 1, '', rsNikonColorSpaceLkUp); + AddBinaryTag (M+$001F, 'VRInfo', 8); + AddByteTag (M+$0020, 'ImageAuthentication', 1, '', rsOffOn); + // 21 + AddUShortTag (M+$0022, 'ActiveD-Lighting', 1, '', rsNikonActiveDLightingLkUp); + AddBinaryTag (M+$0024, 'WorldTime'); + //... + AddUShortTag (M+$002A, 'VignetteControl', 1, '', rsNikonVignetteControlLkUp); + //... + AddUShortTag (M+$0034, 'ShutterMode', 1, '', '', rsNikonShutterModeLkUp); + //.. + AddULongTag (M+$0037, 'MechanicalShutterCount'); + AddBinaryTag (M+$0039, 'LocationInfo'); + //.. + AddUShortTag (M+$003D, 'BlackLevel', 4); + AddUShortTag (M+$004F, 'ColorTemperatureAuto'); + AddStringTag (M+$0080, 'ImageAdjustment'); + AddStringTag (M+$0081, 'ToneComp'); + AddStringTag (M+$0082, 'AuxiliaryLens'); + AddByteTag (M+$0083, 'LensType', 1, '', '', '', TNikonLensTypeTag); + AddURationalTag(M+$0084, 'Lens', 4, '', '', '', TNikonLensTag); + AddURationalTag(M+$0085, 'ManualFocusDistance'); + AddURationalTag(M+$0086, 'DigitalZoom'); + AddByteTag (M+$0087, 'FlashMode', 1, '', rsNikonFlashModeLkUp); + AddBinaryTag (M+$0088, 'AFInfo', 4); + // .. + AddUShortTag (M+$0089, 'ShootingMode', 1, '', '', '', TNikonShootingModeTag); + AddBinaryTag (M+$008B, 'LensFStops', 4); + AddBinaryTag (M+$008C, 'ContrastCurve'); + AddStringTag (M+$008D, 'ColorHude'); + AddStringTag (M+$008F, 'SceneMode'); + AddStringTag (M+$0090, 'LightSource'); + AddSShortTag (M+$0092, 'HueAdjustment'); + AddUShortTag (M+$0093, 'NEFCompression', 1, '', rsNikonNEFCompressionLkUp); + AddSShortTag (M+$0094, 'Saturation'); + AddStringTag (M+$0095, 'NoiseReduction'); + AddBinaryTag (M+$0097, 'NEFLinearizationTable'); + AddUShortTag (M+$0099, 'RawImageCenter', 2); + AddURationalTag(M+$009A, 'SensorPixelSize', 2); + AddStringTag (M+$009C, 'SceneAssist'); + AddUShortTag (M+$009E, 'RetoucheHistory', 10, '', rsNikonRetoucheHistoryLkup); + AddStringTag (M+$00A0, 'SerialNumber'); + AddULongTag (M+$00A2, 'ImageDataSize'); + AddULongTag (M+$00A5, 'ImageCount'); + AddULongTag (M+$00A6, 'DeletedImageCount'); + AddULongTag (M+$00A7, 'ShutterCount', 1, '', '', '', nil, true); + AddStringTag (M+$00A9, 'ImageOptimization'); + AddStringTag (M+$00AA, 'Saturation'); + AddStringTag (M+$00AB, 'VariProgram'); + AddStringTag (M+$00AC, 'ImageStabilization'); + AddStringTag (M+$00AD, 'AFResponse'); + AddUShortTag (M+$00B1, 'HighISONoiseReduction', 1, '', rsNikonHighISONoiseReductionLkup); + AddStringTag (M+$00B3, 'ToningEffect'); + AddBinaryTag (M+$00B6, 'PowerUpTime'); + + // ... + AddBinaryTag (M+$00B8, 'FileInfo'); + AddBinaryTag (M+$00BB, 'RetoucheInfo'); + + AddBinaryTag (M+$00C3, 'BarometerInfo'); + AddStringTag (M+$0E09, 'NikonCaptureVersion'); + // ... + AddUShortTag (M+$0E22, 'NEFBitDepth', 4, '', '', '', TNikonNEFBitDepthTag); + +// AddBinaryTag (M+$0103, 'CompressionValue', 1, '', rsCompressionLkUp); + end; +end; + + +//============================================================================== +// MakerNote reader +//============================================================================== + +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; + t: TTagID; + idx: Integer; + b: Byte; + w: Word; + r: TExifRational; +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 + TAGPARENT_MAKERNOTE+$001F: // VR info + if Length(AData) >= 8 then + with FImgInfo.ExifData do begin + AddMakerNoteStringTag(0, t, 'VRInfoVersion', AData, 4, ''); + AddMakerNoteTag(4, t, 'VibrationReduction', AData[4], rsNikonVibrationReductionLkUp, '', ttUInt8); + AddMakerNoteTag(6, t, 'VRMode', AData[6], rsNikonVRModeLkUp, '', ttUInt8); + end; + TAGPARENT_MAKERNOTE+$0088: + if Length(AData) >= 4 then // AF Info + with FImgInfo.ExifData do begin + b := AData[0]; + AddMakerNoteTag(0, t, 'AFAreaMode', b, rsNikonAFAreaMode, '', ttUInt8); + b := AData[1]; + AddMakerNoteTag(1, t, 'AFPoint', b, rsNikonAFPoint, '', ttUInt8); + w := FixEndian16(PWord(@AData[2])^); + AddmakerNoteTag(2, t, 'AFPointsInFocus', w, rsNikonAFPointsInFocus, '', ttUInt16); + end; + TAGPARENT_MAKERNOTE+$0024: + if Length(AData) >= 4 then // WorldTime + with FImgInfo.ExifData do begin + w := FixEndian16(PWord(@AData[0])^); + AddMakerNoteTag(0, t, 'TimeZone', Integer(w), '', '', ttSInt16); + AddMakerNoteTag(2, t, 'DaylightSavings', byte(AData[2]), rsNoYes, '', ttUInt8); + AddMakerNoteTag(3, t, 'DateDisplayFormat', byte(AData[3]), rsNikonDateDisplayformat, '', ttUInt8); + end; + TAGPARENT_MAKERNOTE+$00B8: + if Length(AData) >= 8 then + with FImgInfo.ExifData do begin + idx := 0; + AddMakerNoteStringTag(idx, t, 'FileInfoVersion', AData, 4); + inc(idx, 4); + w := FixEndian16(PWord(@AData[idx])^); + AddMakerNoteTag(idx, t, 'MemoryCardNumber', Integer(w), '', '', ttUInt16); + inc(idx, 2); + w := FixEndian16(PWord(@AData[idx])^); + AddMakerNoteTag(idx, t, 'DirectoryNumber', Integer(w), '', '', ttUInt16); + inc(idx, 2); + w := FixEndian16(PWord(@AData[idx])^); + AddMakerNoteTag(idx, t, 'FileNumber', Integer(w), '', '', ttUInt16); + end; + TAGPARENT_MAKERNOTE+$BB: + if Length(ADAta) >= 6 then + with FImgInfo.ExifData do begin + AddMakerNoteStringTag(0, t, 'RetouchInfoVersion', AData, 5); + AddMakerNoteTag(5, t, 'RetouchNEFProcessing', byte(AData[5]), '', rsNikonOffOn, ttSInt8); + end; + TAGPARENT_MAKERNOTE+$00C3: + if Length(AData) >= 10 then + with FImgInfo.ExifData do begin + idx := 0; + AddMakerNoteStringTag(idx, t, 'BarometerInfoVersion', AData, 6); + inc(idx, 6); + Move(AData[idx], r, SizeOf(r)); + r.Numerator := FixEndian32(r.Numerator); + r.Denominator := FixEndian32(r.Denominator); + AddMakerNoteTag(idx, t, 'Altitude', r.Numerator/r.Denominator, '', ttSRational); + end; + end; +end; + +procedure TNikonMakerNoteReader.GetTagDefs(AStream: TStream); +var + b: array of byte; + tmp, tmp2: String; + p: Integer; + streamPos: Int64; +begin + if Uppercase(FMake) = 'NIKON CORPORATION' then begin + SetLength(b, 20); + streamPos := AStream.Position; + AStream.Read(b[0], 20); + AStream.Position := streamPos; + SetLength(tmp, 5); + Move(b[0], tmp[1], 5); + if (PosInBytes('Nikon'#00, b) = 0) and ( + (PosInBytes('MM'#00#42#00#00#00#08, b) = 10) or + (PosInBytes('II'#42#00#08#00#00#00, b) = 10) + ) + then + BuildNikon3TagDefs(FTagDefs) + else begin + p := Max(0, Pos(' ', FModel)); + tmp2 := FModel[p+1]; + if (FExifVersion > '0210') or + ((FExifVersion = '') and (tmp2 = 'D') and (FImgFormat = ifTiff)) + then + BuildNikon2TagDefs(FTagDefs) + else + if (tmp = 'Nikon') then + BuildNikon1TagDefs(FTagDefs) + else + BuildNikon2TagDefs(FTagDefs); + end; + end; +end; + +function TNikonMakerNoteReader.Prepare(AStream: TStream): Boolean; +var + b: TBytes; + UCMake: String; + dw: DWord; +begin + Result := false; + UCMake := Uppercase(FMake); + if UCMake = 'NIKON CORPORATION' then begin + SetLength(b, 10); + AStream.Read(b[0], 10); + if PosInBytes('Nikon'#0{#$10#00#00}, b) = 0 then begin + // These MakerNotes are relative to the beginning of the MakerNote's + // TIFF header! + FStartPosition := AStream.Position; + AStream.Read(b[0], 4); + if PosInBytes('MM'#00#42, b) = 0 then + FBigEndian := true + else + if PosInBytes('II'#42#00, b) = 0 then + FBigEndian := false + else + exit; + dw := AStream.ReadDWord; + if FBigEndian then dw := BEToN(dw) else dw := LEToN(dw); + if dw = 8 then + Result := true; + // The stream is now at the beginning of the IFD structure used by + // the Nikon maker notes. + end; + end; +end; + + +//============================================================================== +// Special tags +//============================================================================== + +function TNikonCropHiSpeedTag.GetAsString: String; +var + s: String; + intVal: TExifIntegerArray; +begin + if (FCount = 7) and (toDecodeValue in FOptions) then begin + intVal := AsIntegerArray; + s := Lookup(IntToStr(intVal[0]), FLkupTbl, @SameIntegerFunc); + Result := Format(rsNikonCropHiSpeedMask, [ + s, intval[1], intVal[2], intVal[3], intVal[4], intVal[5], intVal[6] + ]); + end else + Result := inherited; +end; + +function TNikonLensTypeTag.GetAsString: String; +var + intVal: Integer; +begin + if (toDecodeValue in FOptions) then begin + Result := ''; + intVal := AsInteger; + if intVal and 1 <> 0 then Result := Result + 'MF+'; + if intVal and 2 <> 0 then Result := Result + 'D+'; + if intVal and 4 <> 0 then Result := Result + 'G+'; + if intVal and 8 <> 0 then Result := Result + 'VR+'; + if intval and 16 <> 0 then Result := Result + '1+'; + if intVal and 32 <> 0 then Result := Result + 'E+'; + if Result <> '' then SetLength(Result, Length(Result)-1); + end else + Result := inherited; +end; + +function TNikonLensTag.GetAsString: String; +var + values: TExifDoubleArray; +begin + values := AsFloatArray; + if (toDecodeValue in FOptions) and (Length(values) = 4) then + Result := Format('%g-%gmm f/%g-%g', [values[0], values[1], values[2], values[3]], fpExifFmtSettings) + else + Result := inherited; +end; + +function TNikonShootingModetag.GetAsString: String; +var + intVal: Integer; +begin + if (toDecodeValue in FOptions) then begin + intVal := AsInteger; + if intVal = 0 then + Result := 'Single frame' + else begin + Result := ''; + if intVal and 1 <> 0 then Result := Result + 'Continuous, '; + if intVal and 2 <> 0 then Result := Result + 'Delay, '; + if intVal and 4 <> 0 then Result := Result + 'PC Control, '; + if intVal and 8 <> 0 then Result := Result + 'Self-timer, '; + if intval and 16 <> 0 then Result := Result + 'Exposure bracketing, '; + if intVal and 32 <> 0 then Result := Result + 'Auto ISO, '; + if intVal and 64 <> 0 then Result := Result + 'White-balance bracketing, '; + if intVal and 128 <> 0 then Result := Result + 'IR control, '; + if intVal and 256 <> 0 then Result := Result + 'D-Lighting bracketing, '; + if Result <> '' then SetLength(Result, Length(Result)-2); + end; + end else + Result := inherited; +end; + +function TNikonNEFBitDepthTag.GetAsString: String; +var + iVal: TExifIntegerArray; + i: Integer; + n: Integer; +begin + if (FCount = 4) and (toDecodeValue in FOptions) then begin + iVal := AsIntegerArray; + if iVal[0] = 0 then + Result := 'n/a (JPEG)' + else begin + Result := intToStr(iVal[0]); + n := 1; + for i:= Succ(Low(iVal)) to High(iVal) do + if iVal[i] = 0 then + break + else if iVal[i] = iVal[0] then + inc(n) + else begin + Result := inherited; + exit; + end; + Result := Result + ' x ' + IntToStr(n); + end; + end else + Result := inherited; +end; + +initialization + RegisterMakerNoteReader(TNikonMakerNoteReader, 'Nikon Corporation;Nikon', ''); + +end. + diff --git a/components/fpexif/fpemakernoteolympus.pas b/components/fpexif/fpemakernoteolympus.pas new file mode 100644 index 000000000..790afa5cf --- /dev/null +++ b/components/fpexif/fpemakernoteolympus.pas @@ -0,0 +1,263 @@ +unit fpeMakerNoteOlympus; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, + fpeGlobal, fpeTags, fpeExifReadWrite; + +type + TOlympusMakerNoteReader = class(TMakerNoteReader) + protected + FVersion: Integer; + procedure GetTagDefs({%H-}AStream: TStream); override; + function Prepare(AStream: TStream): Boolean; override; + end; + +implementation + +uses + fpeStrConsts, fpeUtils, fpeExifData; + +resourcestring + // Olympus + rsOlympusCCDScanModeLkup = '0:Interlaced,1:Progressive'; + rsOlympusContrastLkup = '0:High,1:Normal,2:Low'; + rsOlympusFlashDevLkup = '0:None,1:Internal,4:External,5:Internal + External'; + 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'; + rsOlympusFlashTypeLkup = '0:None,2:Simple E-System,3:E-System'; + rsOlympusJpegQualLkup = '1:SQ,2:HQ,3:SHQ,4:Raw'; + rsOlympusMacroLkup = '0:Off,1:On,2:Super Macro'; + rsOlympusPreviewImgLength = 'Preview image length'; + rsOlympusPreviewImgStart = 'Preview image start'; + rsOlympusPreviewImgValid = 'Preview image valid'; + rsOlympusSharpnessLkup = '0:Normal,1:Hard,2:Soft'; + 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,' + + '15:Self Portrait+Self Timer,16:Sunset,17:Cuisine,18:Documents,19:Candle,' + + '20:Fireworks,21:Available Light,22:Vivid,23:Underwater Wide1,24:Underwater Macro,' + + '25:Museum,26:Behind Glass,27:Auction,28:Shoot & Select1,29:Shoot & Select2,'+ + '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'; + + +// 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 + +procedure BuildOlympusTagDefs(AList: TTagDefList); +const + M = DWord(TAGPARENT_MAKERNOTE); +begin + Assert(AList <> nil); + with AList do begin + AddBinaryTag (M+$0000, 'Version', 4, '', '', '', TVersionTag); + + { Stores all settings which were in effect when taking the picture. + Details depend on camera. } + AddBinaryTag (M+$0001, 'MinoltaCameraSettingsOld'); //, $FFFF, '', '', '', TSubIFDTag, true); + AddBinaryTag (M+$0003, 'MinoltaCameraSettings'); //, $FFFF, '', '', '', TSubIFDTag, false); + + // this is the size of the JPEG (compressed) or TIFF or RAW file. + AddULongTag (M+$0040, 'CompressedImageSize'); + + { Stores the thumbnail image (640×480). It is in normal JFIF format but the + first byte should be changed to 0xFF. Beware! Sometimes the thumbnail + is not stored in the file and this tag points beyond the end of the file. } + AddBinaryTag (M+$0081, 'ReviewImage'); + + { The cameras D7u, D7i and D7Hi no longer store the thumbnail inside the tag. + It has instead two tags describing the position of the thumbnail in the + file and its size } + AddULongTag (M+$0088, 'PreviewImageStart'); + AddULongTag (M+$0089, 'PreviewImageLength'); + + AddULongTag (M+$0200, 'SpecialMode', 3); + AddUShortTag (M+$0201, 'JpegQuality', 1, '', rsOlympusJpegQualLkup); + AddUShortTag (M+$0202, 'Macro', 1, '', rsOlympusMacroLkup); + AddURationalTag(M+$0204, 'DigitalZoom'); +// AddUShortTag (M+$0207, 'Firmware'); + AddStringTag (M+$9207, 'CameraType'); + AddStringTag (M+$0208, 'PictureInfo'); + AddStringTag (M+$0209, 'CameraID'); + AddUShortTag (M+$020B, 'EpsonImageWidth'); + AddUShortTag (M+$020C, 'EpsonImageHeight'); + AddStringTag (M+$020D, 'EpsonSoftware'); + AddUShortTag (M+$0403, 'SceneMode', 1, '', rsOlympusSceneModeLkup); + AddStringTag (M+$0404, 'SerialNumber'); + AddStringTag (M+$0405, 'Firmware'); + AddSRationalTag(M+$1000, 'ShutterSpeedValue'); + AddSRationalTag(M+$1001, 'ISOValue'); + AddSRationalTag(M+$1002, 'ApertureValue'); + AddSRationalTag(M+$1003, 'BrightnessValue'); + AddUShortTag (M+$1004, 'FlashMode', 1, '', rsOlympusFlashModeLkup); + AddUShortTag (M+$1005, 'FlashDevice', 1, '', rsOlympusFlashDevLkup); + AddURationalTag(M+$1006, 'Bracket'); + AddSShortTag (M+$1007, 'SensorTemperature'); + AddSShortTag (M+$1008, 'LensTemperature'); + AddUShortTag (M+$100B, 'FocusMode', 1, '', rsAutoManual); + AddURationalTag(M+$100C, 'FocusDistance'); + AddUShortTag (M+$100D, 'ZoomStepCount'); + AddUShortTag (M+$100E, 'FocusStepCount'); + AddUShortTag (M+$100F, 'Sharpness', 1, '', rsOlympusSharpnessLkup); + AddUShortTag (M+$1010, 'FlashChargeLevel'); + AddUShortTag (M+$1011, 'ColorMatrix', 9); + AddUShortTag (M+$1012, 'BlackLevel', 4); + AddUShortTag (M+$1015, 'WhiteBalanceMode', 2); + AddUShortTag (M+$1017, 'RedBalance', 2); + AddUShortTag (M+$1018, 'BlueBalance', 2); + AddStringTag (M+$101A, 'SerialNumber'); + AddURationalTag(M+$1023, 'FlashBias'); + AddUShortTag (M+$1029, 'Contrast', 1, '', rsOlympusContrastLkup); + AddUShortTag (M+$102A, 'SharpnessFactor'); + AddUShortTag (M+$102B, 'ColorControl', 6); + AddUShortTag (M+$102C, 'ValidBits', 2); + AddUShortTag (M+$102D, 'CoringFilter'); + AddULongTag (M+$102E, 'FinalWidth'); + AddULongTag (M+$102F, 'FinalHeight'); + AddUShortTag (M+$1030, 'SceneDetect'); + AddULongTag (M+$1031, 'SceneArea', 8); + AddURationalTag(M+$1034, 'CompressionRatio'); + AddUShortTag (M+$1038, 'AFResult'); + AddUShortTag (M+$1039, 'CCDScanMode', 1, '', rsOlympusCCDScanModeLkup); + AddUShortTag (M+$103A, 'NoiseReduction', 1, '', rsOffOn); + AddUShortTag (M+$103B, 'FocusStepInfinity'); + AddUShortTag (M+$103C, 'FocusStepNear'); + AddSRationalTag(M+$103D, 'LightValueCenter'); + AddSRationalTag(M+$103E, 'LightValuePeriphery'); + AddIFDTag (M+$2010, 'Equipment', '', TSubIFDTag); + AddIFDTag (M+$2011, 'CameraSettings', '', TSubIFDTag); + + // Olympus Equipment Tags + AddBinaryTag (E+$0000, 'EquipmentVersion', 4, '', '', '', TVersionTag); + AddStringTag (E+$0100, 'CameraType', 6); + AddStringTag (E+$0101, 'SerialNumber', 32); + AddStringTag (E+$0102, 'InternalSerialNumber', 32); + AddURationalTag(E+$0103, 'FocalPlaneDiagonal'); + AddULongTag (E+$0104, 'BodyFirmwareVersion'); + AddByteTag (E+$0201, 'LensType', 6); + AddStringTag (E+$0202, 'LensSerialNumber', 32); + AddStringTag (E+$0203, 'LensModel'); + AddULongTag (E+$0204, 'LensFirmwareVersion'); + AddUShortTag (E+$0205, 'MaxApertureAtMinFocal'); + AddUShortTag (E+$0206, 'MaxApertureAtMaxFocal'); + AddUShortTag (E+$0207, 'MinFocalLength'); + AddUShortTag (E+$0208, 'MaxFocalLength'); + AddUShortTag (E+$020A, 'MaxAperture'); + AddUShortTag (E+$020B, 'LensProperties'); + AddByteTag (E+$0301, 'Extender', 6); + AddStringTag (E+$0302, 'ExtenderSerialNumber', 32); + AddStringTag (E+$0303, 'ExtenderModel'); + AddULongTag (E+$0304, 'ExtenderFirmwareVersion'); + AddStringTag (E+$0403, 'ConversionLens'); + AddUShortTag (E+$1000, 'FlashType', 1, '', rsOlympusFlashTypeLkup); + AddUShortTag (E+$1001, 'FlashModel', 1, '', rsOlympusFlashModelLkup); + AddULongTag (E+$1002, 'FlashFirmwareVersion'); + AddStringTag (E+$1003, 'FlashSerialNumber', 32); + + // Olympus camera settings tags + AddBinaryTag (C+$0000, 'CameraSettingsVersion', 4, '', '', '', TVersionTag); + AddULongTag (C+$0100, 'PreviewImageValid', 1, rsOlympusPreviewImgValid, rsOffOn); + AddULongTag (C+$0101, 'PreviewImageStart', 1, rsOlympusPreviewImgStart); + AddULongTag (C+$0102, 'PreviewImageLength', 1, rsOlympusPreviewImgLength); + + end; +end; + + +//============================================================================== +// TOlympusMakerNoteReader +//============================================================================== + +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; +var + hdr: array of byte; + p: Int64; +begin + p := AStream.Position; + SetLength(hdr, 11); + AStream.Read(hdr[0], 11); + AStream.Position := p; + + if (PosInBytes(SIGNATURE_V1, hdr) <> 0) and + (PosInBytes(SIGNATURE_V2, hdr) <> 0) and + (PosInBytes(SIGNATURE_V3I, hdr) <> 0) and + (PosInBytes(SIGNATURE_V3M, hdr) <> 0) then exit; + + BuildOlympusTagDefs(FTagDefs); +end; + +{ Read the header and determine the version of the olympus makernotes: + - version 1: header OLYMP#0#1+0, offsets relative to EXIF + - version 2: header OLYMP#0#2#0, offsets relative to EXIF + - version 3: header OLYMPUS#0 + BOM (II or MM) + version (#3#0) + offsets relative to maker notes !!!! } +function TOlympusMakerNoteReader.Prepare(AStream: TStream): Boolean; +var + p: Int64; + hdr: packed array[0..11] of ansichar; +begin + Result := false; + + // Remember begin of makernotes tag. + p := AStream.Position; + + // Read header + AStream.Read(hdr{%H-}, 12); + + // The first 5 bytes must be 'OLYMP'; this is common to all versions + if not ((hdr[0] = 'O') and (hdr[1] = 'L') and (hdr[2] = 'Y') and (hdr[3] = 'M') and (hdr[4] = 'P')) then + exit; + + FVersion := 0; + // Version 1 or 2 if a #0 follows after the 'OLYMP' + if (hdr[5] = #0) then begin + if (hdr[6] = #1) and (hdr[7] = #0) then + FVersion := 1 + else + if (hdr[6] = #2) and (hdr[7] = #0) then + FVersion := 2; + end else + // Version 3 if the first 8 bytes are 'OLYMPUS'#0 + if (hdr[5] = 'U') and (hdr[6] = 'S') and (hdr[7] = #0) then begin + // Endianness marker, like in standard EXIF: 'II' or 'MM' + if (hdr[8] = 'I') and (hdr[9] = 'I') then + FBigEndian := false + else + if (hdr[8] = 'M') and (hdr[9] = 'M') then + FBigEndian := true; + if (hdr[10] = #3) then + FVersion := 3; + FStartPosition := p; // Offsets are relative to maker notes + end; + + // Jump to begin of IFD + case FVersion of + 1, 2: AStream.Position := p + 8; + 3 : AStream.Position := p + 12; + else exit; + end; + + BuildOlympusTagDefs(FTagDefs); + Result := true; +end; + + +initialization + RegisterMakerNoteReader(TOlympusMakerNoteReader, 'Olympus', ''); + +end. + diff --git a/components/fpexif/fpemakernotesanyo.pas b/components/fpexif/fpemakernotesanyo.pas new file mode 100644 index 000000000..06db22493 --- /dev/null +++ b/components/fpexif/fpemakernotesanyo.pas @@ -0,0 +1,65 @@ +unit fpemakernotesanyo; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, + fpeTags, fpeExifReadWrite; + +type + TSanyoMakerNoteReader = class(TMakerNoteReader) + protected + procedure GetTagDefs({%H-}AStream: TStream); override; + end; + +implementation + +uses + fpeStrConsts; + +resourcestring + rsSanyoMacroLkup = '0:Normal,1:Macro,2:View,3:Manual'; + rsSanyoQualityLkup = '0:Normal/Very Low,1:Normal/Low,2:Normal/Medium Low,'+ + '3:Normal/Medium,4:Normal/Medium High,5:Normal/High,6:Normal/Very High'+ + '7:Normal/Super High,256:Fine/Very Low,257:Fine/Low,258:Fine/Medium Low'+ + '259:Fine/Medium,260:Fine/Medium High,261:Fine/High,262:Fine/Very High'+ + '263:Fine/Super High,512:Super Fine/Very Low,513:Super Fine/Low,'+ + '514:Super Fine/Medium Low,515:Super Fine/Medium,516:Super Fine/Medium High,'+ + '517:Super Fine/High,518:Super Fine/Very High,519:Super Fine/Super High'; + rsSanyoSpecialMode = 'Special mode'; + +// from dExif +procedure BuildSanyoTagDefs(AList: TTagDefList); +const + M = DWord(TAGPARENT_MAKERNOTE); +begin + Assert(AList <> nil); + with AList do begin + AddULongTag (M+$0200, 'SpecialMode', 3, rsSanyoSpecialMode); + AddUShortTag (M+$0201, 'Quality', 1, rsQuality, rsSanyoQualityLkup); + AddUShortTag (M+$0202, 'Macro', 1, rsMacro, rsSanyoMacroLkup); + AddURationalTag(M+$0204, 'DigitalZoom', 1, rsDigitalZoom); + end; +end; + +//============================================================================== +// TSanyoMakerNoteReader +//============================================================================== + +procedure TSanyoMakerNoteReader.GetTagDefs(AStream: TStream); +begin + BuildSanyoTagDefs(FTagDefs); +end; + + +//============================================================================== +// initialization +//============================================================================== + +initialization + RegisterMakerNoteReader(TSanyoMakerNoteReader, 'Sanyo', ''); + +end. + diff --git a/components/fpexif/fpestrconsts.pas b/components/fpexif/fpestrconsts.pas index fe302e147..a93b33168 100644 --- a/components/fpexif/fpestrconsts.pas +++ b/components/fpexif/fpestrconsts.pas @@ -337,266 +337,6 @@ resourcestring rsYPosition = 'Y position'; rsYResolution = 'Y resolution'; - // *** MakerNote *** - - // Canon - rsCanonAELkup = '0:Normal AE,1:Exposure compensation,2:AE lock,'+ - '3:AE lock + Exposure compensation,4:No AE'; - { - rsCanonAFLkup = '12288:None (MF),12289:Auto-selected,12290:Right,12291:Center,'+ - '12292:Left'; - } - rsCanonAFLkup = '$2005:Manual AF point selection,$3000:None (MF),' + - '$3001:Auto AF point selection,$3002:Right,$3003:Center,$3004:Left,' + - '$4001:Auto AF point selection,$4006:Face Detect'; - rsCanonAutoRotLkup = '0:None,1:Rotate 90 CW,2:Rotate 180,3:Rotate 270 CW'; - rsCanonBiasLkup = '65472:-2 EV,65484:-1.67 EV,65488:-1.50 EV,65492:-1.33 EV,'+ - '65504:-1 EV,65516:-0.67 EV,65520:-0.50 EV,65524:-0.33 EV,0:0 EV,'+ - '12:0.33 EV,16:0.50 EV,20:0.67 EV,32:1 EV,44:1.33 EV,48:1.50 EV,'+ - '52:1.67 EV,64:2 EV'; - rsCanonCamTypeLkup = '248:EOS High-end,250:Compact,252:EOS Mid-range,255:DV Camera'; - rsCanonEasyLkup = '0:Full Auto,1:Manual,2:Landscape,3:Fast Shutter,4:Slow Shutter,'+ - '5:Night,6:Gray scale,7:Sepia,8:Portrait,9:Sports,10:Macro,11:Black & White,'+ - '12:Pan Focus,13:Vivid,14:Neutral,15:Flash off,16:Long shutter,'+ - '17:Super macro,18:Foliage,19:Indoor,20:Fireworks,21:Beach,22:Underwater,'+ - '23:Snow,24:Kids & Pets,25:Night snapshot,26:Digital macro,27:My colors,'+ - '28:Movie snap,29:Super macro 2,30:Color accent,31:Color swap,32:Aquarium,'+ - '33:ISO3200,34:ISO6400,35:Creative light effect,36:Easy,37:Quick shot,'+ - '38:Creative auto,39:Zoom blur,40:Low light,41:Nostalgic,42:Super vivid,'+ - '43:Poster effect,44:Face self-timer,45:Smile,46:Wink self-timer,'+ - '47:Fisheye effect,48:Miniature effect,49:High-speed burst,'+ - '50:Best image selection,51:High dynamic range,52:Handheld night scene,'+ - '53:Movie digest,54:Live view control,55:Discreet,56:Blur reduction,'+ - '57:Monochrome,58:Toy camera effect,59:Scene intelligent auto,'+ - '60:High-speed burst HQ,61:Smooth skin,62:Soft focus,257:Spotlight,'+ - '258:Night 2,259:Night+,260:Super night,261:Sunset,263:Night scene,'+ - '264:Surface,265:Low light 2'; - rsCanonExposeLkup = '0:Easy shooting,1:Program AE,2:Shutter speed priority AE,'+ - '3:Aperture priority AE,4:Manual,5:Depth-of-field AE,6:M-Dep,7:Bulb'; - rsCanonFlashActLkup = '0:Did not fire,1:Fired'; - rsCanonFlashLkup = '0:Not fired,1:Auto,2:On,3:Red-eye,4:Slow sync,'+ - '5:Auto+red-eye,6:On+red eye,16:External flash'; - rsCanonFocalTypeLkup = '1:Fixed,2:Zoom'; - rsCanonFocTypeLkup = '0:Manual,1:Auto,3:Close-up (macro),8:Locked (pan mode)'; - rsCanonFocusLkup = '0:One-Shot AF,1:AI Servo AF,2:AI Focus AF,3:Manual focus,'+ - '4:Single,5:Continuous,6:Manual focus,16:Pan focus,256:AF+MF,'+ - '512:Movie snap focus,519:Movie servo AF'; - rsCanonGenLkup = '65535:Low,0:Normal,1:High'; - rsCanonImgStabLkup = '0:Off,1:On,2:Shoot only,3:Panning,4:Dynamic,256:Off,'+ - '257:On,258:Shoot only,259:Panning,260:Dynamic'; - rsCanonISOLkup = '0:Not used,15:auto,16:50,17:100,18:200,19:400'; - rsCanonMacroLkup = '1:Macro,2:Normal'; - rsCanonMeterLkup = '0:Default,1:Spot,2:Average,3:Evaluative,4:Partial,'+ - '5:Center-weighted average'; - rsCanonPanDirLkup = '0:Left to right,1:Right to left,2:Bottom to top,'+ - '3:Top to bottom,4:2x2 Matrix (clockwise)'; - rsCanonQualityLkup = '65535:n/a,1:Economy,2:Normal,3:Fine,4:RAW,5:Superfine,'+ - '130:Normal Movie,131:Movie (2)'; - rsCanonRecLkup = '1:JPEG,2:CRW+THM,3:AVI+THM,4:TIF,5:TIF+JPEG,6:CR2,'+ - '7:CR2+JPEG,9:MOV,10:MP4'; - rsCanonSizeLkup = '65535:n/a,0:Large,1:Medium,2:Small,4:5 MPixel,5:2 MPixel,'+ - '6:1.5 MPixel,8:Postcard,9:Widescreen,10:Medium widescreen,14:Small 1,'+ - '15:Small 2,16:Small 3,128:640x480 movie,129:Medium movie,130:Small movie,'+ - '137:128x720 movie,142:1920x1080 movie'; - rsCanonSloShuttLkup = '65535:n/a,0:Off,1:Night scene,2:On,3:None'; - rsCanonWhiteBalLkup = '0:Auto,1:Daylight,2:Cloudy,3:Tungsten,4:Flourescent,'+ - '5:Flash,6:Custom,7:Black & white,8:Shade,9:Manual temperature (Kelvin),'+ - '14:Daylight fluorescent,17:Under water'; - rsCanonZoomLkup = '0:None,1:2x,2:4x,3:Other'; - - // Casio - rsCasioAFMode2Lkup = '0:Off,1:Spot,2:Multi,3:Face detection,4:Tracking,5:Intelligent'; - rsCasioArtMode2Lkup = '0:Normal,8:Silent movie,39:HDR,45:Premium auto,' + - '47:Painting,49:Crayon drawing,51:Panorama,52:Art HDR,62:High Speed night shot,'+ - '64:Monochrome,67:Toy camera,68:Pop art,69:Light tone'; - rsCasioAutoIso2Lkup = '1:On,2:Off,7:On (high sensitivity),8:On (anti-shake),'+ - '10:High Speed'; - rsCasioCCDSensitivityLkup = '64:Normal,125:+1.0,250:+2.0,244:+3.0,80:Normal,'+ - '100:High'; - rsCasioColorFilter2Lkup = '0:Off,1:Blue,3:Green,4:Yellow,5:Red,6:Purple,7:Pink'; - rsCasioColorMode2Lkup = '0:Off,2:Black & White,3:Sepia'; - rsCasioDigitalZoomLkup = '$10000:Off,$10001:2x Digital zoom,'+ - '$20000:2x digital zoom,$40000:4x digital zoom'; - rsCasioDriveMode2Lkup = '0:Single shot,1:Continuous shooting,'+ - '2:Continuous (2 fps),3:Continuous (3 fps),4:Continuous (4 fps),'+ - '5:Continuous (5 fps),6:Continuous (6 fps),7:Continuous (7 fps),'+ - '10:Continuous (10 fps),12:Continuous (12 fps),15:Continuous (15 fps),'+ - '20:Continuous (20 fps),30:Continuous (30 fps),40:Continuous (40 fps),'+ - '60:Continuous (60 fps),240:Auto-N'; - rsCasioEnhancement2Lkup = '0:Off,1:Scenery,3:Green,5:Underwater,9:Flesh tones'; - rsCasioFlashIntensityLkup = '11:Weak,13:Normal,15:Strong'; - rsCasioFlashModeLkup = '1:Auto,2:On,3:Off,4:Red-eye reduction'; - rsCasioFocusingModeLkup = '2:Macro,3:Auto focus,4:Manual focus,5:Infinity'; - rsCasioFocusMode2Lkup = '0:Normal,1:Macro'; - rsCasioFocusMode22Lkup = '0:Manual,1:Focus lock,2:Macro,3:Single-area auto focus,'+ - '5:Infinity,6:Multi-area auto focus,8:Super macro'; - rsCasioImageSize2Lkup = '0:640 x 480,4:1600 x 1200,5:2048 x 1536,'+ - '20:2288 x 1712,21:2592 x 1944,22:2304 x 1728,36:3008 x 2008'; - rsCasioImageStabilization2Lkup = '0:Off,1:On,2:Best shot,3:Movie anti-shake'; - rsCasioISOSpeed2Lkup = '3 = 50,4:64,6:100,9:200'; - rsCasioLightingMode2Lkup = '0:Off,1:High dynamic range,5:Shadow enhance low,'+ - '6:Shadow enhance high'; - rsCasioPortraitRefiner2Lkup = '0:Off,1:+1,2:+2'; - rsCasioRecordingModeLkup = '1:Single shutter,2:Panorama,3:Night scene,'+ - '4:Portrait,5:Landscape'; - rsCasioRecordMode2Lkup = '2:Program AE,3:Shutter priority,4:Aperture priority,'+ - '5:Manual,6:Best shot,17:Movie,19:Movie (19),20:YouTube Movie'; - rsCasioReleaseMode2Lkup = '1:Normal,3:AE Bracketing,11:WB Bracketing,'+ - '13 = Contrast Bracketing,19:High Speed Burst'; - rsCasioSharpness2Lkup = '0:Soft,1:Normal,2:Hard'; - rsCasioSpecialEffectSetting2Lkup = '0:Off,1:Makeup,2:Mist removal,'+ - '3:Vivid landscape,16:Art shot'; - rsCasioVideoQuality2Lkup = '1:Standard,3:HD (720p),4:Full HD (1080p),5:Low'; - rsCasioWhiteBalanceLkup = '1:Auto,2:Tungsten,3:Daylight,4:Fluorescent,'+ - '5:Shade,129:Manual'; - rsCasioWhiteBalance2Lkup = '0:Auto,1:Daylight,2:Shade,3:Tungsten,4:Fluorescent,5:Manual'; - rsCasioWhiteBalance22Lkup = '0:Manual,1:Daylight,2:Cloudy,3:Shade,4:Flash?,'+ - '6:Fluorescent,9:Tungsten?,10:Tungsten,12:Flash'; - - // Fuji - rsFujiSharpnessLkup = '0:-4 (softest),1:-3 (very soft),2:-2 (soft),3:0 (normal),' + - '4:+2 (hard),5:+3 (very hard),6:+4 (hardest),130:-1 (medium soft),'+ - '132:+1 (medium hard),32768:Film Simulation,65535:n/a'; - rsFujiWhiteBalLkup = '0:Auto,256:Daylight,512:Cloudy,768:Daylight Fluorescent,' + - '769:Day White Fluorescent,770:White Fluorescent,771:Warm White Fluorescent,'+ - '772:Living Room Warm White Fluorescent,1024:Incandescent,1280:Flash,'+ - '1536:Underwater,3840:Custom,3841:Custom2,3842:Custom3,3843:Custom4,'+ - '3844:Custom5,4080:Kelvin'; - rsFujiSaturationLkup = '0:0 (normal),128:+1 (medium high),192:+3 (very high),'+ - '224:+4 (highest),256:+2 (high),384:-1 (medium low),512:Low,768:None (B&W),'+ - '769:B&W Red Filter,770:B&W Yellow Filter,771:B&W Green Filter,'+ - '784:B&W Sepia,1024:-2 (low),1216:-3 (very low),1248:-4 (lowest),'+ - '1280:Acros,1281:Acros Red Filter,1282:Acros Yellow Filter,'+ - '1283:Acros Green Filter,32768:Film Simulation'; - rsFujiContrastLkup = '0:Normal,128:Medium High,256:High,384:Medium Low,'+ - '512:Low,32768:Film Simulation'; - rsFujiContrastLkup1 = '0:Normal,256:High,768:Low'; - rsFujiNoiseReductionLkup = '64:Low,128:Normal,256:n/a'; - rsFujiHighIsoNoiseReductionLkup = '0:0 (normal),256:+2 (strong),'+ - '384:+1 (medium strong),448:+3 (very strong),480:+4 (strongest)'+ - '512:-2 (weak),640:-1 (medium weak),704:-3 (very weak),736:-4 (weakest)'; - rsFujiFlashModeLkup = '0:Auto,1:On,2:Off,3:Red-eye reduction,4:External,'+ - '16:Commander,32768:Not Attached,33056:TTL,38976:Manual,39040:Multi-flash,'+ - '43296:1st Curtain (front),51488:2nd Curtain (rear),59680:High Speed Sync (HSS)'; - rsFujiPictureModeLkup = '0:Auto,1:Portrait,2:Landscape,3:Macro,4:Sports,'+ - '5:Night Scene,6:Program AE,7:Natural Light,8:Anti-blur,9:Beach & Snow,'+ - '10:Sunset,11:Museum,12:Party,13:Flower,14:Text,15:Natural Light & Flash,'+ - '16:Beach,17:Snow,18:Fireworks,19:Underwater,20:Portrait with Skin Correction,'+ - '22:Panorama,23:Night (tripod),24:Pro Low-light,25:Pro Focus,26:Portrait 2,'+ - '27:Dog Face Detection,28:Cat Face Detection,64:Advanced Filter,'+ - '256:Aperture-priority AE,512:Shutter speed priority AE,768:Manual'; - rsFujiEXRModeLkup = '128:HR (High Resolution),512:SN (Signal to Noise priority),'+ - '768:DR (Dynamic Range priority)'; - rsFujiShadowHighlightLkup = '-64:+4 (hardest),-48:+3 (very hard),'+ - '-32:+2 (hard),-16:+1 (medium hard)'; - rsFujiShutterTypeLkup = '0:Mechanical,1:Electronic'; - rsFujiAutoBracketingLkup = '0:Off,1:On,2:No flash & flash'; - rsFujiPanoramaDirLkup = '1:Right,2:Up,3:Left,4:Down'; - rsFujiAdvancedFilterLkup = '65536:Pop Color,131072:Hi Key,196608:Toy Camera,'+ - '262144:Miniature, 327680:Dynamic Tone,327681:Partial Color Red,'+ - '327682:Partial Color Yellow,327683:Partial Color Green,'+ - '327684:Partial Color Blue,327685:Partial Color Orange,'+ - '327686:Partial Color Purple,458752:Soft Focus,589824:Low Key'; - rsFujiColorModeLkup = '0:Standard,16:Chrome,48:B & W'; - rsFujiBlurWarningLkup = '0:None,1:Blur Warning'; - rsFujiFocusWarningLkup = '0:Good,1:Out of focus'; - rsFujiExposureWarningLkup = '0:Good,1:Bad exposure'; - rsFujiDynamicRangeLkup = '1:Standard,3:Wide'; - rsFujiSceneRecognLkup = '0:Unrecognized,256:Portrait Image,512:Landscape Image,'+ - '768:Night Scene,1024:Macro'; - - // Minolta - rsMinoltaBracketStepLkup = '0:1/3 EV,1:2/3 EV,2:1 EV'; - rsMinoltaColorModeLkup = '0:Natural color,1:Black & White,2:Vivid color,'+ - '3:Solarization,4:Adobe RGB,5:Sepia,9:Natural,12:Portrait,13:Natural sRGB,'+ - '14:Natural+ sRGB,15:Landscape,16:Evening,17:Night Scene,18:Night Portrait,'+ - '132:Embed Adobe RGB'; - rsMinoltaColorProfileLkup = '0:Not embedded,1:Embedded'; - rsMinoltaDataImprintLkup = '0;None,1:YYYY/MM/DD,2:MM/DD/HH:MM,3:Text,4:Text + ID#'; - rsMinoltaDECPositionLkup = '0:Exposure,1:Contrast,2:Saturation,3:Filter'; - rsMinoltaDigitalZoomLkup = '0:Off,1:Electronic magnification,2:2x'; - rsMinoltaDriveModeLkup = '0:Single,1:Continuous,2:Self-timer,4:Bracketing,'+ - '5:Interval,6:UHS continuous,7:HS continuous'; - rsMinoltaExposureModeLkup = '0:Program,1:Aperture priority,2:Shutter priority,3:Manual'; - rsMinoltaFocusAreaLkup = '0:Wide Focus (normal),1:Spot Focus'; - rsMinoltaFlashMeteringLkup = '0:ADI (Advanced Distance Integration),1:Pre-flash TTL,2:Manual flash control'; - rsMinoltaFlashModeLkup = '0:Fill flash,1:Red-eye reduction,2:Rear flash sync,3:Wireless,4:Off?'; - rsMinoltaFocusModeLkup = '0:AF,1:MF'; - rsMinoltaFolderNameLkup = '0:Standard Form,1:Data Form'; - rsMinoltaImageSizeLkup = '1:1600x1200,2:1280x960,3:640x480,5:2560x1920,6:2272x1704,7:2048x1536'; - rsMinoltaImageSizeLkup1 = '0:Full,1:1600x1200,2:1280x960,3:640x480,6:2080x1560,7:2560x1920,8;3264x2176'; - rsMinoltaImageStabLkup = '1:Off,5:On'; - rsMinoltaInternalFlashLkup = '0:No,1:Fired'; - rsMinoltaIntervalModeLkup = '0:Still image,1:Time-lapse movie'; - rsMinoltaIsoSettingLkup = '0:100,1:200,2:400,3:800,4:Auto,5:64'; - rsMinoltaMeteringModeLkup = '0:Multi-segment,1:Center-weighted average,2:Spot'; - rsMinoltaModelIDLkup = '0:DiMAGE 7/X1/X21 or X31,1:DiMAGE 5,2:DiMAGE S304,'+ - '3:DiMAGE S404,4:DiMAGE 7i,5:DiMAGE 7Hi,6:DiMAGE A1,7:DiMAGE A2 or S414'; - rsMinoltaQualityLkup = '0:Raw,1:Super Fine,2:Fine,3:Standard,4:Economy,5:Extra fine'; - rsMinoltaSceneModeLkup = '0:Standard,1:Portrait,2:Text,3:Night Scene,'+ - '4:Sunset,5:Sports,6:Landscape,7:Night Portrait,8:Macro,9:Super Macro,'+ - '16:Auto,17:Night View/Portrait,18:Sweep Panorama,19:Handheld Night Shot,'+ - '20:Anti Motion Blur,21:Cont. Priority AE,22:Auto+,23:3D Sweep Panorama,'+ - '24:Superior Auto,25:High Sensitivity,26:Fireworks,27:Food,28:Pet,33:HDR,'+ - '65535:n/a'; - rsMinoltaSharpnessLkup = '0:Hard,1:Normal,2:Soft'; - rsMinoltaSubjectProgramLkup = '0:None,1:Portrait,2:Text,3:Night portrait,4:Sunset,5:Sports action'; - rsMinoltaTeleconverterLkup = '$0:None,$4:Minolta/Sony AF 1.4x APO (D) (0x04),'+ - '$5:Minolta/Sony AF 2x APO (D) (0x05),$48 = Minolta/Sony AF 2x APO (D),'+ - '$50:Minolta AF 2x APO II,$60:Minolta AF 2x APO,$88:Minolta/Sony AF 1.4x APO (D),'+ - '$90 = Minolta AF 1.4x APO II,$A0 = Minolta AF 1.4x APO'; - rsMinoltaWhiteBalanceLkup = '$00:Auto,$01:Color Temperature/Color Filter,$10:Daylight,'+ - '$20:Cloudy,$30:Shade,$40:Tungsten,$50:Flash,$60:Fluorescent,$70:Custom'; - rsMinoltaWideFocusZoneLkup = '0:No zone,1:Center zone (horizontal orientation),'+ - '2:Center zone (vertical orientation),3:Left zone,4:Right zone'; - rsMinoltaZoneMatchingLkup = '0:ISO Setting Used,1:High Key,2:Low Key'; - - // Nikon - rsNikonColorModeLkup = '1:Color,2:Monochrome'; - rsNikonConverterLkup = '0:Not used,1:Used'; - rsNikonImgAdjLkup = '0:Normal,1:Bright+,2:Bright-,3:Contrast+,4:Contrast-'; - rsNikonISOLkup = '0:ISO80,2:ISO160,4:ISO320,5:ISO100'; - rsNikonQualityLkup = '1:Vga Basic,2:Vga Normal,3:Vga Fine,4:SXGA Basic,'+ - '5:SXGA Normal,6:SXGA Fine,10:2 Mpixel Basic,11:2 Mpixel Normal,'+ - '12:2 Mpixel Fine'; - rsNikonWhiteBalanceLkup = '0:Auto,1:Preset,2:Daylight,3:Incandescense,'+ - '4:Fluorescence,5:Cloudy,6:SpeedLight'; - - // Olympus - rsOlympusCCDScanModeLkup = '0:Interlaced,1:Progressive'; - rsOlympusContrastLkup = '0:High,1:Normal,2:Low'; - rsOlympusFlashDevLkup = '0:None,1:Internal,4:External,5:Internal + External'; - 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'; - rsOlympusFlashTypeLkup = '0:None,2:Simple E-System,3:E-System'; - rsOlympusJpegQualLkup = '1:SQ,2:HQ,3:SHQ,4:Raw'; - rsOlympusMacroLkup = '0:Off,1:On,2:Super Macro'; - rsOlympusPreviewImgLength = 'Preview image length'; - rsOlympusPreviewImgStart = 'Preview image start'; - rsOlympusPreviewImgValid = 'Preview image valid'; - rsOlympusSharpnessLkup = '0:Normal,1:Hard,2:Soft'; - 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,' + - '15:Self Portrait+Self Timer,16:Sunset,17:Cuisine,18:Documents,19:Candle,' + - '20:Fireworks,21:Available Light,22:Vivid,23:Underwater Wide1,24:Underwater Macro,' + - '25:Museum,26:Behind Glass,27:Auction,28:Shoot & Select1,29:Shoot & Select2,'+ - '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'; - - // Sanyo - rsSanyoMacroLkup = '0:Normal,1:Macro,2:View,3:Manual'; - rsSanyoQualityLkup = '0:Normal/Very Low,1:Normal/Low,2:Normal/Medium Low,'+ - '3:Normal/Medium,4:Normal/Medium High,5:Normal/High,6:Normal/Very High'+ - '7:Normal/Super High,256:Fine/Very Low,257:Fine/Low,258:Fine/Medium Low'+ - '259:Fine/Medium,260:Fine/Medium High,261:Fine/High,262:Fine/Very High'+ - '263:Fine/Super High,512:Super Fine/Very Low,513:Super Fine/Low,'+ - '514:Super Fine/Medium Low,515:Super Fine/Medium,516:Super Fine/Medium High,'+ - '517:Super Fine/High,518:Super Fine/Very High,519:Super Fine/Super High'; - rsSanyoSpecialMode = 'Special mode'; - // *** IPTC tags *** diff --git a/components/fpexif/fpetags.pas b/components/fpexif/fpetags.pas index 98b374678..af96f4252 100644 --- a/components/fpexif/fpetags.pas +++ b/components/fpexif/fpetags.pas @@ -319,7 +319,10 @@ const TSubIFDTag // IFD ); - (* +function SameIntegerFunc(AKey1, AKey2: String): Boolean; +function SameStringFunc(AKey1, AKey2: String): Boolean; + +(* { TTagGroups } function GetGroupFromGeneratingTagID(ATagID: TTagID): TTagGroup; diff --git a/components/fpexif/fpexif_pkg.lpk b/components/fpexif/fpexif_pkg.lpk index de621c76b..e8272e65a 100644 --- a/components/fpexif/fpexif_pkg.lpk +++ b/components/fpexif/fpexif_pkg.lpk @@ -12,7 +12,7 @@ - + @@ -61,6 +61,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/fpexif/fpexif_pkg.pas b/components/fpexif/fpexif_pkg.pas index 5ff57c3e5..4991d9d47 100644 --- a/components/fpexif/fpexif_pkg.pas +++ b/components/fpexif/fpexif_pkg.pas @@ -4,11 +4,14 @@ unit fpexif_pkg; +{$warn 5023 off : no warning about unused units} interface uses fpeGlobal, fpeTags, fpeUtils, fpeMetadata, fpeExifReadWrite, - fpeIptcReadWrite, fpeExifData, fpeIptcData, fpeStrConsts, fpeMakerNote; + fpeIptcReadWrite, fpeExifData, fpeIptcData, fpeStrConsts, fpeMakerNote, + fpeMakerNoteNikon, fpeMakerNoteCanonCasio, fpeMakerNoteMinolta, + fpeMakerNoteOlympus, fpeMakerNoteEpson, fpeMakerNoteFuji, fpemakernotesanyo; implementation diff --git a/components/fpexif/languages/fpestrconsts.de.po b/components/fpexif/languages/fpestrconsts.de.po index 1d5709109..f0f18e41a 100644 --- a/components/fpexif/languages/fpestrconsts.de.po +++ b/components/fpexif/languages/fpestrconsts.de.po @@ -55,214 +55,6 @@ msgstr "" msgid "The metadata structure cannot be saved because the file format of the receiving file is not known or not supported." msgstr "Die Metadaten-Struktur kann nicht gespeichert werden, weil das Format der Zieldatei nicht bekannt ist oder nicht unterstützt wird." -#: fpestrconsts.rscanonaelkup -msgid "0:Normal AE,1:Exposure compensation,2:AE lock,3:AE lock + Exposure compensation,4:No AE" -msgstr "" - -#: fpestrconsts.rscanonaflkup -msgid "$2005:Manual AF point selection,$3000:None (MF),$3001:Auto AF point selection,$3002:Right,$3003:Center,$3004:Left,$4001:Auto AF point selection,$4006:Face Detect" -msgstr "" - -#: fpestrconsts.rscanonautorotlkup -msgid "0:None,1:Rotate 90 CW,2:Rotate 180,3:Rotate 270 CW" -msgstr "" - -#: fpestrconsts.rscanonbiaslkup -msgid "65472:-2 EV,65484:-1.67 EV,65488:-1.50 EV,65492:-1.33 EV,65504:-1 EV,65516:-0.67 EV,65520:-0.50 EV,65524:-0.33 EV,0:0 EV,12:0.33 EV,16:0.50 EV,20:0.67 EV,32:1 EV,44:1.33 EV,48:1.50 EV,52:1.67 EV,64:2 EV" -msgstr "" - -#: fpestrconsts.rscanoncamtypelkup -msgid "248:EOS High-end,250:Compact,252:EOS Mid-range,255:DV Camera" -msgstr "" - -#: fpestrconsts.rscanoneasylkup -msgid "0:Full Auto,1:Manual,2:Landscape,3:Fast Shutter,4:Slow Shutter,5:Night,6:Gray scale,7:Sepia,8:Portrait,9:Sports,10:Macro,11:Black & White,12:Pan Focus,13:Vivid,14:Neutral,15:Flash off,16:Long shutter,17:Super macro,18:Foliage,19:Indoor,20:Fireworks,21:Beach,22:Underwater,23:Snow,24:Kids & Pets,25:Night snapshot,26:Digital macro,27:My colors,28:Movie snap,29:Super macro 2,30:Color accent,31:Color swap,32:Aquarium,33:ISO3200,34:ISO6400,35:Creative light effect,36:Easy,37:Quick shot,38:Creative auto,39:Zoom blur,40:Low light,41:Nostalgic,42:Super vivid,43:Poster effect,44:Face self-timer,45:Smile,46:Wink self-timer,47:Fisheye effect,48:Miniature effect,49:High-speed burst,50:Best image selection,51:High dynamic range,52:Handheld night scene,53:Movie digest,54:Live view control,55:Discreet,56:Blur reduction,57:Monochrome,58:Toy camera effect,59:Scene intelligent auto,60:High-speed burst HQ,61:Smooth skin,62:Soft focus,257:Spotlight,258:Night 2,259:Night+,260:Super night,261:Sunset,263:Night scene,264:Surface,265:Low light 2" -msgstr "" - -#: fpestrconsts.rscanonexposelkup -msgid "0:Easy shooting,1:Program AE,2:Shutter speed priority AE,3:Aperture priority AE,4:Manual,5:Depth-of-field AE,6:M-Dep,7:Bulb" -msgstr "" - -#: fpestrconsts.rscanonflashactlkup -msgid "0:Did not fire,1:Fired" -msgstr "0:Hat nicht ausgelöst,1:Ausgelöst" - -#: fpestrconsts.rscanonflashlkup -msgid "0:Not fired,1:Auto,2:On,3:Red-eye,4:Slow sync,5:Auto+red-eye,6:On+red eye,16:External flash" -msgstr "" - -#: fpestrconsts.rscanonfocaltypelkup -msgid "1:Fixed,2:Zoom" -msgstr "" - -#: fpestrconsts.rscanonfoctypelkup -msgid "0:Manual,1:Auto,3:Close-up (macro),8:Locked (pan mode)" -msgstr "" - -#: fpestrconsts.rscanonfocuslkup -msgid "0:One-Shot AF,1:AI Servo AF,2:AI Focus AF,3:Manual focus,4:Single,5:Continuous,6:Manual focus,16:Pan focus,256:AF+MF,512:Movie snap focus,519:Movie servo AF" -msgstr "" - -#: fpestrconsts.rscanongenlkup -msgid "65535:Low,0:Normal,1:High" -msgstr "" - -#: fpestrconsts.rscanonimgstablkup -msgid "0:Off,1:On,2:Shoot only,3:Panning,4:Dynamic,256:Off,257:On,258:Shoot only,259:Panning,260:Dynamic" -msgstr "" - -#: fpestrconsts.rscanonisolkup -msgid "0:Not used,15:auto,16:50,17:100,18:200,19:400" -msgstr "" - -#: fpestrconsts.rscanonmacrolkup -msgid "1:Macro,2:Normal" -msgstr "1:Makro,2:Normal" - -#: fpestrconsts.rscanonmeterlkup -msgid "0:Default,1:Spot,2:Average,3:Evaluative,4:Partial,5:Center-weighted average" -msgstr "" - -#: fpestrconsts.rscanonpandirlkup -msgid "0:Left to right,1:Right to left,2:Bottom to top,3:Top to bottom,4:2x2 Matrix (clockwise)" -msgstr "" - -#: fpestrconsts.rscanonqualitylkup -msgid "65535:n/a,1:Economy,2:Normal,3:Fine,4:RAW,5:Superfine,130:Normal Movie,131:Movie (2)" -msgstr "" - -#: fpestrconsts.rscanonreclkup -msgid "1:JPEG,2:CRW+THM,3:AVI+THM,4:TIF,5:TIF+JPEG,6:CR2,7:CR2+JPEG,9:MOV,10:MP4" -msgstr "" - -#: fpestrconsts.rscanonsizelkup -msgid "65535:n/a,0:Large,1:Medium,2:Small,4:5 MPixel,5:2 MPixel,6:1.5 MPixel,8:Postcard,9:Widescreen,10:Medium widescreen,14:Small 1,15:Small 2,16:Small 3,128:640x480 movie,129:Medium movie,130:Small movie,137:128x720 movie,142:1920x1080 movie" -msgstr "" - -#: fpestrconsts.rscanonsloshuttlkup -msgid "65535:n/a,0:Off,1:Night scene,2:On,3:None" -msgstr "" - -#: fpestrconsts.rscanonwhiteballkup -msgid "0:Auto,1:Daylight,2:Cloudy,3:Tungsten,4:Flourescent,5:Flash,6:Custom,7:Black & white,8:Shade,9:Manual temperature (Kelvin),14:Daylight fluorescent,17:Under water" -msgstr "" - -#: fpestrconsts.rscanonzoomlkup -msgid "0:None,1:2x,2:4x,3:Other" -msgstr "0:Nichts,1:2x,2:4x,3:Anderer Wert" - -#: fpestrconsts.rscasioafmode2lkup -msgid "0:Off,1:Spot,2:Multi,3:Face detection,4:Tracking,5:Intelligent" -msgstr "" - -#: fpestrconsts.rscasioartmode2lkup -msgid "0:Normal,8:Silent movie,39:HDR,45:Premium auto,47:Painting,49:Crayon drawing,51:Panorama,52:Art HDR,62:High Speed night shot,64:Monochrome,67:Toy camera,68:Pop art,69:Light tone" -msgstr "" - -#: fpestrconsts.rscasioautoiso2lkup -msgid "1:On,2:Off,7:On (high sensitivity),8:On (anti-shake),10:High Speed" -msgstr "" - -#: fpestrconsts.rscasioccdsensitivitylkup -msgid "64:Normal,125:+1.0,250:+2.0,244:+3.0,80:Normal,100:High" -msgstr "" - -#: fpestrconsts.rscasiocolorfilter2lkup -msgid "0:Off,1:Blue,3:Green,4:Yellow,5:Red,6:Purple,7:Pink" -msgstr "" - -#: fpestrconsts.rscasiocolormode2lkup -msgid "0:Off,2:Black & White,3:Sepia" -msgstr "0:Aus,1:Schwarzweiß,2:Sepia" - -#: fpestrconsts.rscasiodigitalzoomlkup -msgid "$10000:Off,$10001:2x Digital zoom,$20000:2x digital zoom,$40000:4x digital zoom" -msgstr "" - -#: fpestrconsts.rscasiodrivemode2lkup -msgid "0:Single shot,1:Continuous shooting,2:Continuous (2 fps),3:Continuous (3 fps),4:Continuous (4 fps),5:Continuous (5 fps),6:Continuous (6 fps),7:Continuous (7 fps),10:Continuous (10 fps),12:Continuous (12 fps),15:Continuous (15 fps),20:Continuous (20 fps),30:Continuous (30 fps),40:Continuous (40 fps),60:Continuous (60 fps),240:Auto-N" -msgstr "" - -#: fpestrconsts.rscasioenhancement2lkup -msgid "0:Off,1:Scenery,3:Green,5:Underwater,9:Flesh tones" -msgstr "" - -#: fpestrconsts.rscasioflashintensitylkup -msgid "11:Weak,13:Normal,15:Strong" -msgstr "11:Schwach,13:Normal,15:Stark" - -#: fpestrconsts.rscasioflashmodelkup -msgid "1:Auto,2:On,3:Off,4:Red-eye reduction" -msgstr "1:Auto,2:Ein,3:Unterdrückung von roten Augen" - -#: fpestrconsts.rscasiofocusingmodelkup -msgid "2:Macro,3:Auto focus,4:Manual focus,5:Infinity" -msgstr "2:Makro,3:Auto-Fokus,4:Manuelle Entfernungseinstellung,5:Unendlich" - -#: fpestrconsts.rscasiofocusmode22lkup -msgid "0:Manual,1:Focus lock,2:Macro,3:Single-area auto focus,5:Infinity,6:Multi-area auto focus,8:Super macro" -msgstr "" - -#: fpestrconsts.rscasiofocusmode2lkup -msgid "0:Normal,1:Macro" -msgstr "0:Normal,1:Makro" - -#: fpestrconsts.rscasioimagesize2lkup -msgid "0:640 x 480,4:1600 x 1200,5:2048 x 1536,20:2288 x 1712,21:2592 x 1944,22:2304 x 1728,36:3008 x 2008" -msgstr "" - -#: fpestrconsts.rscasioimagestabilization2lkup -msgid "0:Off,1:On,2:Best shot,3:Movie anti-shake" -msgstr "" - -#: fpestrconsts.rscasioisospeed2lkup -msgid "3 = 50,4:64,6:100,9:200" -msgstr "" - -#: fpestrconsts.rscasiolightingmode2lkup -msgid "0:Off,1:High dynamic range,5:Shadow enhance low,6:Shadow enhance high" -msgstr "" - -#: fpestrconsts.rscasioportraitrefiner2lkup -msgid "0:Off,1:+1,2:+2" -msgstr "" - -#: fpestrconsts.rscasiorecordingmodelkup -msgid "1:Single shutter,2:Panorama,3:Night scene,4:Portrait,5:Landscape" -msgstr "" - -#: fpestrconsts.rscasiorecordmode2lkup -msgid "2:Program AE,3:Shutter priority,4:Aperture priority,5:Manual,6:Best shot,17:Movie,19:Movie (19),20:YouTube Movie" -msgstr "" - -#: fpestrconsts.rscasioreleasemode2lkup -msgid "1:Normal,3:AE Bracketing,11:WB Bracketing,13 = Contrast Bracketing,19:High Speed Burst" -msgstr "" - -#: fpestrconsts.rscasiosharpness2lkup -msgid "0:Soft,1:Normal,2:Hard" -msgstr "0:Weich,1:Normal,2:Hart" - -#: fpestrconsts.rscasiospecialeffectsetting2lkup -msgid "0:Off,1:Makeup,2:Mist removal,3:Vivid landscape,16:Art shot" -msgstr "" - -#: fpestrconsts.rscasiovideoquality2lkup -msgid "1:Standard,3:HD (720p),4:Full HD (1080p),5:Low" -msgstr "" - -#: fpestrconsts.rscasiowhitebalance22lkup -msgid "0:Manual,1:Daylight,2:Cloudy,3:Shade,4:Flash?,6:Fluorescent,9:Tungsten?,10:Tungsten,12:Flash" -msgstr "" - -#: fpestrconsts.rscasiowhitebalance2lkup -msgid "0:Auto,1:Daylight,2:Shade,3:Tungsten,4:Fluorescent,5:Manual" -msgstr "" - -#: fpestrconsts.rscasiowhitebalancelkup -msgid "1:Auto,2:Tungsten,3:Daylight,4:Fluorescent,5:Shade,129:Manual" -msgstr "1:Auto,2:Wolframlampe,3:Tagelicht,4:Leuchstoffröhre,5:Schatten,129:Manuell" - #: fpestrconsts.rscategory msgid "Category" msgstr "Kategorie" @@ -521,90 +313,6 @@ msgstr "" msgid "Focal plane y resolution" msgstr "" -#: fpestrconsts.rsfujiadvancedfilterlkup -msgid "65536:Pop Color,131072:Hi Key,196608:Toy Camera,262144:Miniature, 327680:Dynamic Tone,327681:Partial Color Red,327682:Partial Color Yellow,327683:Partial Color Green,327684:Partial Color Blue,327685:Partial Color Orange,327686:Partial Color Purple,458752:Soft Focus,589824:Low Key" -msgstr "" - -#: fpestrconsts.rsfujiautobracketinglkup -msgid "0:Off,1:On,2:No flash & flash" -msgstr "" - -#: fpestrconsts.rsfujiblurwarninglkup -msgid "0:None,1:Blur Warning" -msgstr "0:Nichts,1:Unschärfewarnung" - -#: fpestrconsts.rsfujicolormodelkup -msgid "0:Standard,16:Chrome,48:B & W" -msgstr "" - -#: fpestrconsts.rsfujicontrastlkup -msgid "0:Normal,128:Medium High,256:High,384:Medium Low,512:Low,32768:Film Simulation" -msgstr "" - -#: fpestrconsts.rsfujicontrastlkup1 -msgid "0:Normal,256:High,768:Low" -msgstr "0:Normal,256:Hoch,768:Niedrig" - -#: fpestrconsts.rsfujidynamicrangelkup -msgid "1:Standard,3:Wide" -msgstr "1:Standard,3:Breit" - -#: fpestrconsts.rsfujiexposurewarninglkup -msgid "0:Good,1:Bad exposure" -msgstr "0:Gut,1:Schlecht belichtet" - -#: fpestrconsts.rsfujiexrmodelkup -msgid "128:HR (High Resolution),512:SN (Signal to Noise priority),768:DR (Dynamic Range priority)" -msgstr "" - -#: fpestrconsts.rsfujiflashmodelkup -msgid "0:Auto,1:On,2:Off,3:Red-eye reduction,4:External,16:Commander,32768:Not Attached,33056:TTL,38976:Manual,39040:Multi-flash,43296:1st Curtain (front),51488:2nd Curtain (rear),59680:High Speed Sync (HSS)" -msgstr "" - -#: fpestrconsts.rsfujifocuswarninglkup -msgid "0:Good,1:Out of focus" -msgstr "0:Gut,1:Unscharf" - -#: fpestrconsts.rsfujihighisonoisereductionlkup -msgid "0:0 (normal),256:+2 (strong),384:+1 (medium strong),448:+3 (very strong),480:+4 (strongest)512:-2 (weak),640:-1 (medium weak),704:-3 (very weak),736:-4 (weakest)" -msgstr "" - -#: fpestrconsts.rsfujinoisereductionlkup -msgid "64:Low,128:Normal,256:n/a" -msgstr "" - -#: fpestrconsts.rsfujipanoramadirlkup -msgid "1:Right,2:Up,3:Left,4:Down" -msgstr "1:Rechts,2:Oben,3:Links,4:Unten" - -#: fpestrconsts.rsfujipicturemodelkup -msgid "0:Auto,1:Portrait,2:Landscape,3:Macro,4:Sports,5:Night Scene,6:Program AE,7:Natural Light,8:Anti-blur,9:Beach & Snow,10:Sunset,11:Museum,12:Party,13:Flower,14:Text,15:Natural Light & Flash,16:Beach,17:Snow,18:Fireworks,19:Underwater,20:Portrait with Skin Correction,22:Panorama,23:Night (tripod),24:Pro Low-light,25:Pro Focus,26:Portrait 2,27:Dog Face Detection,28:Cat Face Detection,64:Advanced Filter,256:Aperture-priority AE,512:Shutter speed priority AE,768:Manual" -msgstr "" - -#: fpestrconsts.rsfujisaturationlkup -msgid "0:0 (normal),128:+1 (medium high),192:+3 (very high),224:+4 (highest),256:+2 (high),384:-1 (medium low),512:Low,768:None (B&W),769:B&W Red Filter,770:B&W Yellow Filter,771:B&W Green Filter,784:B&W Sepia,1024:-2 (low),1216:-3 (very low),1248:-4 (lowest),1280:Acros,1281:Acros Red Filter,1282:Acros Yellow Filter,1283:Acros Green Filter,32768:Film Simulation" -msgstr "" - -#: fpestrconsts.rsfujiscenerecognlkup -msgid "0:Unrecognized,256:Portrait Image,512:Landscape Image,768:Night Scene,1024:Macro" -msgstr "" - -#: fpestrconsts.rsfujishadowhighlightlkup -msgid "-64:+4 (hardest),-48:+3 (very hard),-32:+2 (hard),-16:+1 (medium hard)" -msgstr "" - -#: fpestrconsts.rsfujisharpnesslkup -msgid "0:-4 (softest),1:-3 (very soft),2:-2 (soft),3:0 (normal),4:+2 (hard),5:+3 (very hard),6:+4 (hardest),130:-1 (medium soft),132:+1 (medium hard),32768:Film Simulation,65535:n/a" -msgstr "" - -#: fpestrconsts.rsfujishuttertypelkup -msgid "0:Mechanical,1:Electronic" -msgstr "0:Mechanisch,1:Elektronisch" - -#: fpestrconsts.rsfujiwhiteballkup -msgid "0:Auto,256:Daylight,512:Cloudy,768:Daylight Fluorescent,769:Day White Fluorescent,770:White Fluorescent,771:Warm White Fluorescent,772:Living Room Warm White Fluorescent,1024:Incandescent,1280:Flash,1536:Underwater,3840:Custom,3841:Custom2,3842:Custom3,3843:Custom4,3844:Custom5,4080:Kelvin" -msgstr "" - #: fpestrconsts.rsgaincontrol msgid "Gain control" msgstr "Verstärkungsregelung" @@ -1001,122 +709,6 @@ msgstr "Belichtungsmess-Modus" msgid "0:Unknown,1:Average,2:Center-weighted average,3:Spot,4:Multi-spot,5:Multi-segment,6:Partial,255:Other" msgstr "" -#: fpestrconsts.rsminoltabracketsteplkup -msgid "0:1/3 EV,1:2/3 EV,2:1 EV" -msgstr "0:1/3 EV,1:2/3 EV,2:1 EV" - -#: fpestrconsts.rsminoltacolormodelkup -msgid "0:Natural color,1:Black & White,2:Vivid color,3:Solarization,4:Adobe RGB,5:Sepia,9:Natural,12:Portrait,13:Natural sRGB,14:Natural+ sRGB,15:Landscape,16:Evening,17:Night Scene,18:Night Portrait,132:Embed Adobe RGB" -msgstr "" - -#: fpestrconsts.rsminoltacolorprofilelkup -msgid "0:Not embedded,1:Embedded" -msgstr "" - -#: fpestrconsts.rsminoltadataimprintlkup -msgid "0;None,1:YYYY/MM/DD,2:MM/DD/HH:MM,3:Text,4:Text + ID#" -msgstr "" - -#: fpestrconsts.rsminoltadecpositionlkup -msgid "0:Exposure,1:Contrast,2:Saturation,3:Filter" -msgstr "0:Belichtung,1:Kontrast,2:Sättigung,3:Filter" - -#: fpestrconsts.rsminoltadigitalzoomlkup -msgid "0:Off,1:Electronic magnification,2:2x" -msgstr "" - -#: fpestrconsts.rsminoltadrivemodelkup -msgid "0:Single,1:Continuous,2:Self-timer,4:Bracketing,5:Interval,6:UHS continuous,7:HS continuous" -msgstr "0:Einzeln,1:Ständig,2:Selbstauslöser,4:Belichtungsreihe,4:Intervall,6:UHS ständig,7:HS ständig" - -#: fpestrconsts.rsminoltaexposuremodelkup -msgid "0:Program,1:Aperture priority,2:Shutter priority,3:Manual" -msgstr "" - -#: fpestrconsts.rsminoltaflashmeteringlkup -msgid "0:ADI (Advanced Distance Integration),1:Pre-flash TTL,2:Manual flash control" -msgstr "" - -#: fpestrconsts.rsminoltaflashmodelkup -msgid "0:Fill flash,1:Red-eye reduction,2:Rear flash sync,3:Wireless,4:Off?" -msgstr "" - -#: fpestrconsts.rsminoltafocusarealkup -msgid "0:Wide Focus (normal),1:Spot Focus" -msgstr "" - -#: fpestrconsts.rsminoltafocusmodelkup -msgid "0:AF,1:MF" -msgstr "0:AF,1:MF" - -#: fpestrconsts.rsminoltafoldernamelkup -msgid "0:Standard Form,1:Data Form" -msgstr "" - -#: fpestrconsts.rsminoltaimagesizelkup -msgid "1:1600x1200,2:1280x960,3:640x480,5:2560x1920,6:2272x1704,7:2048x1536" -msgstr "1:1600x1200,2:1280x960,3:640x480,5:2560x1920,6:2272x1704,7:2048x1536" - -#: fpestrconsts.rsminoltaimagesizelkup1 -msgid "0:Full,1:1600x1200,2:1280x960,3:640x480,6:2080x1560,7:2560x1920,8;3264x2176" -msgstr "0:Full,1:1600x1200,2:1280x960,3:640x480,6:2080x1560,7:2560x1920,8;3264x2176" - -#: fpestrconsts.rsminoltaimagestablkup -msgid "1:Off,5:On" -msgstr "1:Aus,2:Ein" - -#: fpestrconsts.rsminoltainternalflashlkup -msgid "0:No,1:Fired" -msgstr "0:Nein,1:Ausgelöst" - -#: fpestrconsts.rsminoltaintervalmodelkup -msgid "0:Still image,1:Time-lapse movie" -msgstr "" - -#: fpestrconsts.rsminoltaisosettinglkup -msgid "0:100,1:200,2:400,3:800,4:Auto,5:64" -msgstr "0:100,1:200,2:400,3:800,4:Auto,5:64" - -#: fpestrconsts.rsminoltameteringmodelkup -msgid "0:Multi-segment,1:Center-weighted average,2:Spot" -msgstr "" - -#: fpestrconsts.rsminoltamodelidlkup -msgid "0:DiMAGE 7/X1/X21 or X31,1:DiMAGE 5,2:DiMAGE S304,3:DiMAGE S404,4:DiMAGE 7i,5:DiMAGE 7Hi,6:DiMAGE A1,7:DiMAGE A2 or S414" -msgstr "" - -#: fpestrconsts.rsminoltaqualitylkup -msgid "0:Raw,1:Super Fine,2:Fine,3:Standard,4:Economy,5:Extra fine" -msgstr "" - -#: fpestrconsts.rsminoltascenemodelkup -msgid "0:Standard,1:Portrait,2:Text,3:Night Scene,4:Sunset,5:Sports,6:Landscape,7:Night Portrait,8:Macro,9:Super Macro,16:Auto,17:Night View/Portrait,18:Sweep Panorama,19:Handheld Night Shot,20:Anti Motion Blur,21:Cont. Priority AE,22:Auto+,23:3D Sweep Panorama,24:Superior Auto,25:High Sensitivity,26:Fireworks,27:Food,28:Pet,33:HDR,65535:n/a" -msgstr "" - -#: fpestrconsts.rsminoltasharpnesslkup -msgid "0:Hard,1:Normal,2:Soft" -msgstr "0:Hart,1:Normal,2:Weich" - -#: fpestrconsts.rsminoltasubjectprogramlkup -msgid "0:None,1:Portrait,2:Text,3:Night portrait,4:Sunset,5:Sports action" -msgstr "" - -#: fpestrconsts.rsminoltateleconverterlkup -msgid "$0:None,$4:Minolta/Sony AF 1.4x APO (D) (0x04),$5:Minolta/Sony AF 2x APO (D) (0x05),$48 = Minolta/Sony AF 2x APO (D),$50:Minolta AF 2x APO II,$60:Minolta AF 2x APO,$88:Minolta/Sony AF 1.4x APO (D),$90 = Minolta AF 1.4x APO II,$A0 = Minolta AF 1.4x APO" -msgstr "" - -#: fpestrconsts.rsminoltawhitebalancelkup -msgid "$00:Auto,$01:Color Temperature/Color Filter,$10:Daylight,$20:Cloudy,$30:Shade,$40:Tungsten,$50:Flash,$60:Fluorescent,$70:Custom" -msgstr "" - -#: fpestrconsts.rsminoltawidefocuszonelkup -msgid "0:No zone,1:Center zone (horizontal orientation),2:Center zone (vertical orientation),3:Left zone,4:Right zone" -msgstr "" - -#: fpestrconsts.rsminoltazonematchinglkup -msgid "0:ISO Setting Used,1:High Key,2:Low Key" -msgstr "" - #: fpestrconsts.rsminsamplevalue msgid "Min sample value" msgstr "Minimaler Abtastwert" @@ -1129,30 +721,6 @@ msgstr "Modell" msgid "More thumbnail tags than expected." msgstr "Mehr Vorschaubild-Tags als erwartet." -#: fpestrconsts.rsnikoncolormodelkup -msgid "1:Color,2:Monochrome" -msgstr "1:Farbe,2:Monochrom" - -#: fpestrconsts.rsnikonconverterlkup -msgid "0:Not used,1:Used" -msgstr "0:Nicht benutzt,1:Benutzt" - -#: fpestrconsts.rsnikonimgadjlkup -msgid "0:Normal,1:Bright+,2:Bright-,3:Contrast+,4:Contrast-" -msgstr "" - -#: fpestrconsts.rsnikonisolkup -msgid "0:ISO80,2:ISO160,4:ISO320,5:ISO100" -msgstr "" - -#: fpestrconsts.rsnikonqualitylkup -msgid "1:Vga Basic,2:Vga Normal,3:Vga Fine,4:SXGA Basic,5:SXGA Normal,6:SXGA Fine,10:2 Mpixel Basic,11:2 Mpixel Normal,12:2 Mpixel Fine" -msgstr "" - -#: fpestrconsts.rsnikonwhitebalancelkup -msgid "0:Auto,1:Preset,2:Daylight,3:Incandescense,4:Fluorescence,5:Cloudy,6:SpeedLight" -msgstr "" - #: fpestrconsts.rsnormallowhigh msgctxt "fpestrconsts.rsnormallowhigh" msgid "0:Normal,1:Low,2:High" @@ -1163,7 +731,7 @@ msgctxt "fpestrconsts.rsnormalsofthard" msgid "0:Normal,1:Soft,2:Hard" msgstr "" "0:Normal,1:Weich,2:\n" -"Hart" +"Hart\n" #: fpestrconsts.rsnovalidiptcfile msgid "No valid IPTC file" @@ -1215,58 +783,6 @@ msgstr "Zeitzone für Datum/Uhrzeit der Digitalisierung" msgid "Time zone for date/time original" msgstr "Zeitzone für Original-Datum/Uhrzeit" -#: fpestrconsts.rsolympusccdscanmodelkup -msgid "0:Interlaced,1:Progressive" -msgstr "" - -#: fpestrconsts.rsolympuscontrastlkup -msgid "0:High,1:Normal,2:Low" -msgstr "0:Hoch,1:Normal,2:Niedrig" - -#: fpestrconsts.rsolympusflashdevlkup -msgid "0:None,1:Internal,4:External,5:Internal + External" -msgstr "" - -#: fpestrconsts.rsolympusflashmodelkup -msgid "2:On,3;Off" -msgstr "2:Ein,3:Aus" - -#: fpestrconsts.rsolympusflashmodellkup -msgid "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" -msgstr "" - -#: fpestrconsts.rsolympusflashtypelkup -msgid "0:None,2:Simple E-System,3:E-System" -msgstr "" - -#: fpestrconsts.rsolympusjpegquallkup -msgid "1:SQ,2:HQ,3:SHQ,4:Raw" -msgstr "" - -#: fpestrconsts.rsolympusmacrolkup -msgid "0:Off,1:On,2:Super Macro" -msgstr "0:Aus,1:Ein,2:Super-Makro" - -#: fpestrconsts.rsolympuspreviewimglength -msgid "Preview image length" -msgstr "Vorschaubildhöhe" - -#: fpestrconsts.rsolympuspreviewimgstart -msgid "Preview image start" -msgstr "Vorschaubild-Start" - -#: fpestrconsts.rsolympuspreviewimgvalid -msgid "Preview image valid" -msgstr "Vorschaubild ungültig" - -#: fpestrconsts.rsolympusscenemodelkup -msgid "0:Normal,1:Standard,2:Auto,3:Intelligent Auto,4:Portrait,5:Landscape+Portrait,6:Landscape,7:Night Scene,8:Night+Portrait9:Sport,10:Self Portrait,11:Indoor,12:Beach & Snow,13:Beach,14:Snow,15:Self Portrait+Self Timer,16:Sunset,17:Cuisine,18:Documents,19:Candle,20:Fireworks,21:Available Light,22:Vivid,23:Underwater Wide1,24:Underwater Macro,25:Museum,26:Behind Glass,27:Auction,28:Shoot & Select1,29:Shoot & Select2,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" -msgstr "" - -#: fpestrconsts.rsolympussharpnesslkup -msgid "0:Normal,1:Hard,2:Soft" -msgstr "0:Normal,1:Hart,2:Weich" - #: fpestrconsts.rsorientation msgid "Orientation" msgstr "Ausrichtung" @@ -1403,18 +919,6 @@ msgstr "" msgid "Samples per pixel" msgstr "" -#: fpestrconsts.rssanyomacrolkup -msgid "0:Normal,1:Macro,2:View,3:Manual" -msgstr "0:Normal,1.Makro,2:Ansicht,3:Manuell" - -#: fpestrconsts.rssanyoqualitylkup -msgid "0:Normal/Very Low,1:Normal/Low,2:Normal/Medium Low,3:Normal/Medium,4:Normal/Medium High,5:Normal/High,6:Normal/Very High7:Normal/Super High,256:Fine/Very Low,257:Fine/Low,258:Fine/Medium Low259:Fine/Medium,260:Fine/Medium High,261:Fine/High,262:Fine/Very High263:Fine/Super High,512:Super Fine/Very Low,513:Super Fine/Low,514:Super Fine/Medium Low,515:Super Fine/Medium,516:Super Fine/Medium High,517:Super Fine/High,518:Super Fine/Very High,519:Super Fine/Super High" -msgstr "" - -#: fpestrconsts.rssanyospecialmode -msgid "Special mode" -msgstr "Spezialmodus" - #: fpestrconsts.rssaturation msgid "Saturation" msgstr "Sättigung" @@ -1691,3 +1195,4 @@ msgstr "Y-Position" #: fpestrconsts.rsyresolution msgid "Y resolution" msgstr "Y-Auflösung" + diff --git a/components/fpexif/languages/fpestrconsts.po b/components/fpexif/languages/fpestrconsts.po index 5344e26bb..e534f0137 100644 --- a/components/fpexif/languages/fpestrconsts.po +++ b/components/fpexif/languages/fpestrconsts.po @@ -45,214 +45,6 @@ msgstr "" msgid "The metadata structure cannot be saved because the file format of the receiving file is not known or not supported." msgstr "" -#: fpestrconsts.rscanonaelkup -msgid "0:Normal AE,1:Exposure compensation,2:AE lock,3:AE lock + Exposure compensation,4:No AE" -msgstr "" - -#: fpestrconsts.rscanonaflkup -msgid "$2005:Manual AF point selection,$3000:None (MF),$3001:Auto AF point selection,$3002:Right,$3003:Center,$3004:Left,$4001:Auto AF point selection,$4006:Face Detect" -msgstr "" - -#: fpestrconsts.rscanonautorotlkup -msgid "0:None,1:Rotate 90 CW,2:Rotate 180,3:Rotate 270 CW" -msgstr "" - -#: fpestrconsts.rscanonbiaslkup -msgid "65472:-2 EV,65484:-1.67 EV,65488:-1.50 EV,65492:-1.33 EV,65504:-1 EV,65516:-0.67 EV,65520:-0.50 EV,65524:-0.33 EV,0:0 EV,12:0.33 EV,16:0.50 EV,20:0.67 EV,32:1 EV,44:1.33 EV,48:1.50 EV,52:1.67 EV,64:2 EV" -msgstr "" - -#: fpestrconsts.rscanoncamtypelkup -msgid "248:EOS High-end,250:Compact,252:EOS Mid-range,255:DV Camera" -msgstr "" - -#: fpestrconsts.rscanoneasylkup -msgid "0:Full Auto,1:Manual,2:Landscape,3:Fast Shutter,4:Slow Shutter,5:Night,6:Gray scale,7:Sepia,8:Portrait,9:Sports,10:Macro,11:Black & White,12:Pan Focus,13:Vivid,14:Neutral,15:Flash off,16:Long shutter,17:Super macro,18:Foliage,19:Indoor,20:Fireworks,21:Beach,22:Underwater,23:Snow,24:Kids & Pets,25:Night snapshot,26:Digital macro,27:My colors,28:Movie snap,29:Super macro 2,30:Color accent,31:Color swap,32:Aquarium,33:ISO3200,34:ISO6400,35:Creative light effect,36:Easy,37:Quick shot,38:Creative auto,39:Zoom blur,40:Low light,41:Nostalgic,42:Super vivid,43:Poster effect,44:Face self-timer,45:Smile,46:Wink self-timer,47:Fisheye effect,48:Miniature effect,49:High-speed burst,50:Best image selection,51:High dynamic range,52:Handheld night scene,53:Movie digest,54:Live view control,55:Discreet,56:Blur reduction,57:Monochrome,58:Toy camera effect,59:Scene intelligent auto,60:High-speed burst HQ,61:Smooth skin,62:Soft focus,257:Spotlight,258:Night 2,259:Night+,260:Super night,261:Sunset,263:Night scene,264:Surface,265:Low light 2" -msgstr "" - -#: fpestrconsts.rscanonexposelkup -msgid "0:Easy shooting,1:Program AE,2:Shutter speed priority AE,3:Aperture priority AE,4:Manual,5:Depth-of-field AE,6:M-Dep,7:Bulb" -msgstr "" - -#: fpestrconsts.rscanonflashactlkup -msgid "0:Did not fire,1:Fired" -msgstr "" - -#: fpestrconsts.rscanonflashlkup -msgid "0:Not fired,1:Auto,2:On,3:Red-eye,4:Slow sync,5:Auto+red-eye,6:On+red eye,16:External flash" -msgstr "" - -#: fpestrconsts.rscanonfocaltypelkup -msgid "1:Fixed,2:Zoom" -msgstr "" - -#: fpestrconsts.rscanonfoctypelkup -msgid "0:Manual,1:Auto,3:Close-up (macro),8:Locked (pan mode)" -msgstr "" - -#: fpestrconsts.rscanonfocuslkup -msgid "0:One-Shot AF,1:AI Servo AF,2:AI Focus AF,3:Manual focus,4:Single,5:Continuous,6:Manual focus,16:Pan focus,256:AF+MF,512:Movie snap focus,519:Movie servo AF" -msgstr "" - -#: fpestrconsts.rscanongenlkup -msgid "65535:Low,0:Normal,1:High" -msgstr "" - -#: fpestrconsts.rscanonimgstablkup -msgid "0:Off,1:On,2:Shoot only,3:Panning,4:Dynamic,256:Off,257:On,258:Shoot only,259:Panning,260:Dynamic" -msgstr "" - -#: fpestrconsts.rscanonisolkup -msgid "0:Not used,15:auto,16:50,17:100,18:200,19:400" -msgstr "" - -#: fpestrconsts.rscanonmacrolkup -msgid "1:Macro,2:Normal" -msgstr "" - -#: fpestrconsts.rscanonmeterlkup -msgid "0:Default,1:Spot,2:Average,3:Evaluative,4:Partial,5:Center-weighted average" -msgstr "" - -#: fpestrconsts.rscanonpandirlkup -msgid "0:Left to right,1:Right to left,2:Bottom to top,3:Top to bottom,4:2x2 Matrix (clockwise)" -msgstr "" - -#: fpestrconsts.rscanonqualitylkup -msgid "65535:n/a,1:Economy,2:Normal,3:Fine,4:RAW,5:Superfine,130:Normal Movie,131:Movie (2)" -msgstr "" - -#: fpestrconsts.rscanonreclkup -msgid "1:JPEG,2:CRW+THM,3:AVI+THM,4:TIF,5:TIF+JPEG,6:CR2,7:CR2+JPEG,9:MOV,10:MP4" -msgstr "" - -#: fpestrconsts.rscanonsizelkup -msgid "65535:n/a,0:Large,1:Medium,2:Small,4:5 MPixel,5:2 MPixel,6:1.5 MPixel,8:Postcard,9:Widescreen,10:Medium widescreen,14:Small 1,15:Small 2,16:Small 3,128:640x480 movie,129:Medium movie,130:Small movie,137:128x720 movie,142:1920x1080 movie" -msgstr "" - -#: fpestrconsts.rscanonsloshuttlkup -msgid "65535:n/a,0:Off,1:Night scene,2:On,3:None" -msgstr "" - -#: fpestrconsts.rscanonwhiteballkup -msgid "0:Auto,1:Daylight,2:Cloudy,3:Tungsten,4:Flourescent,5:Flash,6:Custom,7:Black & white,8:Shade,9:Manual temperature (Kelvin),14:Daylight fluorescent,17:Under water" -msgstr "" - -#: fpestrconsts.rscanonzoomlkup -msgid "0:None,1:2x,2:4x,3:Other" -msgstr "" - -#: fpestrconsts.rscasioafmode2lkup -msgid "0:Off,1:Spot,2:Multi,3:Face detection,4:Tracking,5:Intelligent" -msgstr "" - -#: fpestrconsts.rscasioartmode2lkup -msgid "0:Normal,8:Silent movie,39:HDR,45:Premium auto,47:Painting,49:Crayon drawing,51:Panorama,52:Art HDR,62:High Speed night shot,64:Monochrome,67:Toy camera,68:Pop art,69:Light tone" -msgstr "" - -#: fpestrconsts.rscasioautoiso2lkup -msgid "1:On,2:Off,7:On (high sensitivity),8:On (anti-shake),10:High Speed" -msgstr "" - -#: fpestrconsts.rscasioccdsensitivitylkup -msgid "64:Normal,125:+1.0,250:+2.0,244:+3.0,80:Normal,100:High" -msgstr "" - -#: fpestrconsts.rscasiocolorfilter2lkup -msgid "0:Off,1:Blue,3:Green,4:Yellow,5:Red,6:Purple,7:Pink" -msgstr "" - -#: fpestrconsts.rscasiocolormode2lkup -msgid "0:Off,2:Black & White,3:Sepia" -msgstr "" - -#: fpestrconsts.rscasiodigitalzoomlkup -msgid "$10000:Off,$10001:2x Digital zoom,$20000:2x digital zoom,$40000:4x digital zoom" -msgstr "" - -#: fpestrconsts.rscasiodrivemode2lkup -msgid "0:Single shot,1:Continuous shooting,2:Continuous (2 fps),3:Continuous (3 fps),4:Continuous (4 fps),5:Continuous (5 fps),6:Continuous (6 fps),7:Continuous (7 fps),10:Continuous (10 fps),12:Continuous (12 fps),15:Continuous (15 fps),20:Continuous (20 fps),30:Continuous (30 fps),40:Continuous (40 fps),60:Continuous (60 fps),240:Auto-N" -msgstr "" - -#: fpestrconsts.rscasioenhancement2lkup -msgid "0:Off,1:Scenery,3:Green,5:Underwater,9:Flesh tones" -msgstr "" - -#: fpestrconsts.rscasioflashintensitylkup -msgid "11:Weak,13:Normal,15:Strong" -msgstr "" - -#: fpestrconsts.rscasioflashmodelkup -msgid "1:Auto,2:On,3:Off,4:Red-eye reduction" -msgstr "" - -#: fpestrconsts.rscasiofocusingmodelkup -msgid "2:Macro,3:Auto focus,4:Manual focus,5:Infinity" -msgstr "" - -#: fpestrconsts.rscasiofocusmode22lkup -msgid "0:Manual,1:Focus lock,2:Macro,3:Single-area auto focus,5:Infinity,6:Multi-area auto focus,8:Super macro" -msgstr "" - -#: fpestrconsts.rscasiofocusmode2lkup -msgid "0:Normal,1:Macro" -msgstr "" - -#: fpestrconsts.rscasioimagesize2lkup -msgid "0:640 x 480,4:1600 x 1200,5:2048 x 1536,20:2288 x 1712,21:2592 x 1944,22:2304 x 1728,36:3008 x 2008" -msgstr "" - -#: fpestrconsts.rscasioimagestabilization2lkup -msgid "0:Off,1:On,2:Best shot,3:Movie anti-shake" -msgstr "" - -#: fpestrconsts.rscasioisospeed2lkup -msgid "3 = 50,4:64,6:100,9:200" -msgstr "" - -#: fpestrconsts.rscasiolightingmode2lkup -msgid "0:Off,1:High dynamic range,5:Shadow enhance low,6:Shadow enhance high" -msgstr "" - -#: fpestrconsts.rscasioportraitrefiner2lkup -msgid "0:Off,1:+1,2:+2" -msgstr "" - -#: fpestrconsts.rscasiorecordingmodelkup -msgid "1:Single shutter,2:Panorama,3:Night scene,4:Portrait,5:Landscape" -msgstr "" - -#: fpestrconsts.rscasiorecordmode2lkup -msgid "2:Program AE,3:Shutter priority,4:Aperture priority,5:Manual,6:Best shot,17:Movie,19:Movie (19),20:YouTube Movie" -msgstr "" - -#: fpestrconsts.rscasioreleasemode2lkup -msgid "1:Normal,3:AE Bracketing,11:WB Bracketing,13 = Contrast Bracketing,19:High Speed Burst" -msgstr "" - -#: fpestrconsts.rscasiosharpness2lkup -msgid "0:Soft,1:Normal,2:Hard" -msgstr "" - -#: fpestrconsts.rscasiospecialeffectsetting2lkup -msgid "0:Off,1:Makeup,2:Mist removal,3:Vivid landscape,16:Art shot" -msgstr "" - -#: fpestrconsts.rscasiovideoquality2lkup -msgid "1:Standard,3:HD (720p),4:Full HD (1080p),5:Low" -msgstr "" - -#: fpestrconsts.rscasiowhitebalance22lkup -msgid "0:Manual,1:Daylight,2:Cloudy,3:Shade,4:Flash?,6:Fluorescent,9:Tungsten?,10:Tungsten,12:Flash" -msgstr "" - -#: fpestrconsts.rscasiowhitebalance2lkup -msgid "0:Auto,1:Daylight,2:Shade,3:Tungsten,4:Fluorescent,5:Manual" -msgstr "" - -#: fpestrconsts.rscasiowhitebalancelkup -msgid "1:Auto,2:Tungsten,3:Daylight,4:Fluorescent,5:Shade,129:Manual" -msgstr "" - #: fpestrconsts.rscategory msgid "Category" msgstr "" @@ -511,90 +303,6 @@ msgstr "" msgid "Focal plane y resolution" msgstr "" -#: fpestrconsts.rsfujiadvancedfilterlkup -msgid "65536:Pop Color,131072:Hi Key,196608:Toy Camera,262144:Miniature, 327680:Dynamic Tone,327681:Partial Color Red,327682:Partial Color Yellow,327683:Partial Color Green,327684:Partial Color Blue,327685:Partial Color Orange,327686:Partial Color Purple,458752:Soft Focus,589824:Low Key" -msgstr "" - -#: fpestrconsts.rsfujiautobracketinglkup -msgid "0:Off,1:On,2:No flash & flash" -msgstr "" - -#: fpestrconsts.rsfujiblurwarninglkup -msgid "0:None,1:Blur Warning" -msgstr "" - -#: fpestrconsts.rsfujicolormodelkup -msgid "0:Standard,16:Chrome,48:B & W" -msgstr "" - -#: fpestrconsts.rsfujicontrastlkup -msgid "0:Normal,128:Medium High,256:High,384:Medium Low,512:Low,32768:Film Simulation" -msgstr "" - -#: fpestrconsts.rsfujicontrastlkup1 -msgid "0:Normal,256:High,768:Low" -msgstr "" - -#: fpestrconsts.rsfujidynamicrangelkup -msgid "1:Standard,3:Wide" -msgstr "" - -#: fpestrconsts.rsfujiexposurewarninglkup -msgid "0:Good,1:Bad exposure" -msgstr "" - -#: fpestrconsts.rsfujiexrmodelkup -msgid "128:HR (High Resolution),512:SN (Signal to Noise priority),768:DR (Dynamic Range priority)" -msgstr "" - -#: fpestrconsts.rsfujiflashmodelkup -msgid "0:Auto,1:On,2:Off,3:Red-eye reduction,4:External,16:Commander,32768:Not Attached,33056:TTL,38976:Manual,39040:Multi-flash,43296:1st Curtain (front),51488:2nd Curtain (rear),59680:High Speed Sync (HSS)" -msgstr "" - -#: fpestrconsts.rsfujifocuswarninglkup -msgid "0:Good,1:Out of focus" -msgstr "" - -#: fpestrconsts.rsfujihighisonoisereductionlkup -msgid "0:0 (normal),256:+2 (strong),384:+1 (medium strong),448:+3 (very strong),480:+4 (strongest)512:-2 (weak),640:-1 (medium weak),704:-3 (very weak),736:-4 (weakest)" -msgstr "" - -#: fpestrconsts.rsfujinoisereductionlkup -msgid "64:Low,128:Normal,256:n/a" -msgstr "" - -#: fpestrconsts.rsfujipanoramadirlkup -msgid "1:Right,2:Up,3:Left,4:Down" -msgstr "" - -#: fpestrconsts.rsfujipicturemodelkup -msgid "0:Auto,1:Portrait,2:Landscape,3:Macro,4:Sports,5:Night Scene,6:Program AE,7:Natural Light,8:Anti-blur,9:Beach & Snow,10:Sunset,11:Museum,12:Party,13:Flower,14:Text,15:Natural Light & Flash,16:Beach,17:Snow,18:Fireworks,19:Underwater,20:Portrait with Skin Correction,22:Panorama,23:Night (tripod),24:Pro Low-light,25:Pro Focus,26:Portrait 2,27:Dog Face Detection,28:Cat Face Detection,64:Advanced Filter,256:Aperture-priority AE,512:Shutter speed priority AE,768:Manual" -msgstr "" - -#: fpestrconsts.rsfujisaturationlkup -msgid "0:0 (normal),128:+1 (medium high),192:+3 (very high),224:+4 (highest),256:+2 (high),384:-1 (medium low),512:Low,768:None (B&W),769:B&W Red Filter,770:B&W Yellow Filter,771:B&W Green Filter,784:B&W Sepia,1024:-2 (low),1216:-3 (very low),1248:-4 (lowest),1280:Acros,1281:Acros Red Filter,1282:Acros Yellow Filter,1283:Acros Green Filter,32768:Film Simulation" -msgstr "" - -#: fpestrconsts.rsfujiscenerecognlkup -msgid "0:Unrecognized,256:Portrait Image,512:Landscape Image,768:Night Scene,1024:Macro" -msgstr "" - -#: fpestrconsts.rsfujishadowhighlightlkup -msgid "-64:+4 (hardest),-48:+3 (very hard),-32:+2 (hard),-16:+1 (medium hard)" -msgstr "" - -#: fpestrconsts.rsfujisharpnesslkup -msgid "0:-4 (softest),1:-3 (very soft),2:-2 (soft),3:0 (normal),4:+2 (hard),5:+3 (very hard),6:+4 (hardest),130:-1 (medium soft),132:+1 (medium hard),32768:Film Simulation,65535:n/a" -msgstr "" - -#: fpestrconsts.rsfujishuttertypelkup -msgid "0:Mechanical,1:Electronic" -msgstr "" - -#: fpestrconsts.rsfujiwhiteballkup -msgid "0:Auto,256:Daylight,512:Cloudy,768:Daylight Fluorescent,769:Day White Fluorescent,770:White Fluorescent,771:Warm White Fluorescent,772:Living Room Warm White Fluorescent,1024:Incandescent,1280:Flash,1536:Underwater,3840:Custom,3841:Custom2,3842:Custom3,3843:Custom4,3844:Custom5,4080:Kelvin" -msgstr "" - #: fpestrconsts.rsgaincontrol msgid "Gain control" msgstr "" @@ -991,122 +699,6 @@ msgstr "" msgid "0:Unknown,1:Average,2:Center-weighted average,3:Spot,4:Multi-spot,5:Multi-segment,6:Partial,255:Other" msgstr "" -#: fpestrconsts.rsminoltabracketsteplkup -msgid "0:1/3 EV,1:2/3 EV,2:1 EV" -msgstr "" - -#: fpestrconsts.rsminoltacolormodelkup -msgid "0:Natural color,1:Black & White,2:Vivid color,3:Solarization,4:Adobe RGB,5:Sepia,9:Natural,12:Portrait,13:Natural sRGB,14:Natural+ sRGB,15:Landscape,16:Evening,17:Night Scene,18:Night Portrait,132:Embed Adobe RGB" -msgstr "" - -#: fpestrconsts.rsminoltacolorprofilelkup -msgid "0:Not embedded,1:Embedded" -msgstr "" - -#: fpestrconsts.rsminoltadataimprintlkup -msgid "0;None,1:YYYY/MM/DD,2:MM/DD/HH:MM,3:Text,4:Text + ID#" -msgstr "" - -#: fpestrconsts.rsminoltadecpositionlkup -msgid "0:Exposure,1:Contrast,2:Saturation,3:Filter" -msgstr "" - -#: fpestrconsts.rsminoltadigitalzoomlkup -msgid "0:Off,1:Electronic magnification,2:2x" -msgstr "" - -#: fpestrconsts.rsminoltadrivemodelkup -msgid "0:Single,1:Continuous,2:Self-timer,4:Bracketing,5:Interval,6:UHS continuous,7:HS continuous" -msgstr "" - -#: fpestrconsts.rsminoltaexposuremodelkup -msgid "0:Program,1:Aperture priority,2:Shutter priority,3:Manual" -msgstr "" - -#: fpestrconsts.rsminoltaflashmeteringlkup -msgid "0:ADI (Advanced Distance Integration),1:Pre-flash TTL,2:Manual flash control" -msgstr "" - -#: fpestrconsts.rsminoltaflashmodelkup -msgid "0:Fill flash,1:Red-eye reduction,2:Rear flash sync,3:Wireless,4:Off?" -msgstr "" - -#: fpestrconsts.rsminoltafocusarealkup -msgid "0:Wide Focus (normal),1:Spot Focus" -msgstr "" - -#: fpestrconsts.rsminoltafocusmodelkup -msgid "0:AF,1:MF" -msgstr "" - -#: fpestrconsts.rsminoltafoldernamelkup -msgid "0:Standard Form,1:Data Form" -msgstr "" - -#: fpestrconsts.rsminoltaimagesizelkup -msgid "1:1600x1200,2:1280x960,3:640x480,5:2560x1920,6:2272x1704,7:2048x1536" -msgstr "" - -#: fpestrconsts.rsminoltaimagesizelkup1 -msgid "0:Full,1:1600x1200,2:1280x960,3:640x480,6:2080x1560,7:2560x1920,8;3264x2176" -msgstr "" - -#: fpestrconsts.rsminoltaimagestablkup -msgid "1:Off,5:On" -msgstr "" - -#: fpestrconsts.rsminoltainternalflashlkup -msgid "0:No,1:Fired" -msgstr "" - -#: fpestrconsts.rsminoltaintervalmodelkup -msgid "0:Still image,1:Time-lapse movie" -msgstr "" - -#: fpestrconsts.rsminoltaisosettinglkup -msgid "0:100,1:200,2:400,3:800,4:Auto,5:64" -msgstr "" - -#: fpestrconsts.rsminoltameteringmodelkup -msgid "0:Multi-segment,1:Center-weighted average,2:Spot" -msgstr "" - -#: fpestrconsts.rsminoltamodelidlkup -msgid "0:DiMAGE 7/X1/X21 or X31,1:DiMAGE 5,2:DiMAGE S304,3:DiMAGE S404,4:DiMAGE 7i,5:DiMAGE 7Hi,6:DiMAGE A1,7:DiMAGE A2 or S414" -msgstr "" - -#: fpestrconsts.rsminoltaqualitylkup -msgid "0:Raw,1:Super Fine,2:Fine,3:Standard,4:Economy,5:Extra fine" -msgstr "" - -#: fpestrconsts.rsminoltascenemodelkup -msgid "0:Standard,1:Portrait,2:Text,3:Night Scene,4:Sunset,5:Sports,6:Landscape,7:Night Portrait,8:Macro,9:Super Macro,16:Auto,17:Night View/Portrait,18:Sweep Panorama,19:Handheld Night Shot,20:Anti Motion Blur,21:Cont. Priority AE,22:Auto+,23:3D Sweep Panorama,24:Superior Auto,25:High Sensitivity,26:Fireworks,27:Food,28:Pet,33:HDR,65535:n/a" -msgstr "" - -#: fpestrconsts.rsminoltasharpnesslkup -msgid "0:Hard,1:Normal,2:Soft" -msgstr "" - -#: fpestrconsts.rsminoltasubjectprogramlkup -msgid "0:None,1:Portrait,2:Text,3:Night portrait,4:Sunset,5:Sports action" -msgstr "" - -#: fpestrconsts.rsminoltateleconverterlkup -msgid "$0:None,$4:Minolta/Sony AF 1.4x APO (D) (0x04),$5:Minolta/Sony AF 2x APO (D) (0x05),$48 = Minolta/Sony AF 2x APO (D),$50:Minolta AF 2x APO II,$60:Minolta AF 2x APO,$88:Minolta/Sony AF 1.4x APO (D),$90 = Minolta AF 1.4x APO II,$A0 = Minolta AF 1.4x APO" -msgstr "" - -#: fpestrconsts.rsminoltawhitebalancelkup -msgid "$00:Auto,$01:Color Temperature/Color Filter,$10:Daylight,$20:Cloudy,$30:Shade,$40:Tungsten,$50:Flash,$60:Fluorescent,$70:Custom" -msgstr "" - -#: fpestrconsts.rsminoltawidefocuszonelkup -msgid "0:No zone,1:Center zone (horizontal orientation),2:Center zone (vertical orientation),3:Left zone,4:Right zone" -msgstr "" - -#: fpestrconsts.rsminoltazonematchinglkup -msgid "0:ISO Setting Used,1:High Key,2:Low Key" -msgstr "" - #: fpestrconsts.rsminsamplevalue msgid "Min sample value" msgstr "" @@ -1119,30 +711,6 @@ msgstr "" msgid "More thumbnail tags than expected." msgstr "" -#: fpestrconsts.rsnikoncolormodelkup -msgid "1:Color,2:Monochrome" -msgstr "" - -#: fpestrconsts.rsnikonconverterlkup -msgid "0:Not used,1:Used" -msgstr "" - -#: fpestrconsts.rsnikonimgadjlkup -msgid "0:Normal,1:Bright+,2:Bright-,3:Contrast+,4:Contrast-" -msgstr "" - -#: fpestrconsts.rsnikonisolkup -msgid "0:ISO80,2:ISO160,4:ISO320,5:ISO100" -msgstr "" - -#: fpestrconsts.rsnikonqualitylkup -msgid "1:Vga Basic,2:Vga Normal,3:Vga Fine,4:SXGA Basic,5:SXGA Normal,6:SXGA Fine,10:2 Mpixel Basic,11:2 Mpixel Normal,12:2 Mpixel Fine" -msgstr "" - -#: fpestrconsts.rsnikonwhitebalancelkup -msgid "0:Auto,1:Preset,2:Daylight,3:Incandescense,4:Fluorescence,5:Cloudy,6:SpeedLight" -msgstr "" - #: fpestrconsts.rsnormallowhigh msgctxt "fpestrconsts.rsnormallowhigh" msgid "0:Normal,1:Low,2:High" @@ -1203,58 +771,6 @@ msgstr "" msgid "Time zone for date/time original" msgstr "" -#: fpestrconsts.rsolympusccdscanmodelkup -msgid "0:Interlaced,1:Progressive" -msgstr "" - -#: fpestrconsts.rsolympuscontrastlkup -msgid "0:High,1:Normal,2:Low" -msgstr "" - -#: fpestrconsts.rsolympusflashdevlkup -msgid "0:None,1:Internal,4:External,5:Internal + External" -msgstr "" - -#: fpestrconsts.rsolympusflashmodelkup -msgid "2:On,3;Off" -msgstr "" - -#: fpestrconsts.rsolympusflashmodellkup -msgid "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" -msgstr "" - -#: fpestrconsts.rsolympusflashtypelkup -msgid "0:None,2:Simple E-System,3:E-System" -msgstr "" - -#: fpestrconsts.rsolympusjpegquallkup -msgid "1:SQ,2:HQ,3:SHQ,4:Raw" -msgstr "" - -#: fpestrconsts.rsolympusmacrolkup -msgid "0:Off,1:On,2:Super Macro" -msgstr "" - -#: fpestrconsts.rsolympuspreviewimglength -msgid "Preview image length" -msgstr "" - -#: fpestrconsts.rsolympuspreviewimgstart -msgid "Preview image start" -msgstr "" - -#: fpestrconsts.rsolympuspreviewimgvalid -msgid "Preview image valid" -msgstr "" - -#: fpestrconsts.rsolympusscenemodelkup -msgid "0:Normal,1:Standard,2:Auto,3:Intelligent Auto,4:Portrait,5:Landscape+Portrait,6:Landscape,7:Night Scene,8:Night+Portrait9:Sport,10:Self Portrait,11:Indoor,12:Beach & Snow,13:Beach,14:Snow,15:Self Portrait+Self Timer,16:Sunset,17:Cuisine,18:Documents,19:Candle,20:Fireworks,21:Available Light,22:Vivid,23:Underwater Wide1,24:Underwater Macro,25:Museum,26:Behind Glass,27:Auction,28:Shoot & Select1,29:Shoot & Select2,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" -msgstr "" - -#: fpestrconsts.rsolympussharpnesslkup -msgid "0:Normal,1:Hard,2:Soft" -msgstr "" - #: fpestrconsts.rsorientation msgid "Orientation" msgstr "" @@ -1391,18 +907,6 @@ msgstr "" msgid "Samples per pixel" msgstr "" -#: fpestrconsts.rssanyomacrolkup -msgid "0:Normal,1:Macro,2:View,3:Manual" -msgstr "" - -#: fpestrconsts.rssanyoqualitylkup -msgid "0:Normal/Very Low,1:Normal/Low,2:Normal/Medium Low,3:Normal/Medium,4:Normal/Medium High,5:Normal/High,6:Normal/Very High7:Normal/Super High,256:Fine/Very Low,257:Fine/Low,258:Fine/Medium Low259:Fine/Medium,260:Fine/Medium High,261:Fine/High,262:Fine/Very High263:Fine/Super High,512:Super Fine/Very Low,513:Super Fine/Low,514:Super Fine/Medium Low,515:Super Fine/Medium,516:Super Fine/Medium High,517:Super Fine/High,518:Super Fine/Very High,519:Super Fine/Super High" -msgstr "" - -#: fpestrconsts.rssanyospecialmode -msgid "Special mode" -msgstr "" - #: fpestrconsts.rssaturation msgid "Saturation" msgstr ""