fpexif: Split makernote code off into separate units for each camera make. Add many makernote tags for Nikon cameras.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6803 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2019-01-26 00:15:13 +00:00
parent c5067eba22
commit 8bf2380851
26 changed files with 1986 additions and 2189 deletions

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="10"/>
<Version Value="11"/>
<PathDelim Value="\"/>
<General>
<Flags>
@ -22,9 +22,10 @@
<Version Value="2"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
</local>
<FormatVersion Value="2"/>
<Modes Count="1">
<Mode0 Name="default"/>
</Modes>
</RunParams>
<RequiredPackages Count="1">
<Item1>

View File

@ -13,7 +13,6 @@
<XPManifest>
<DpiAware Value="True"/>
</XPManifest>
<Icon Value="0"/>
</General>
<BuildModes Count="1">
<Item1 Name="Default" Default="True"/>

View File

@ -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

View File

@ -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

View File

@ -31,7 +31,7 @@
<PackageName Value="LCL"/>
</Item2>
</RequiredPackages>
<Units Count="2">
<Units Count="3">
<Unit0>
<Filename Value="MetadataViewer.lpr"/>
<IsPartOfProject Value="True"/>
@ -44,6 +44,11 @@
<ResourceBaseClass Value="Form"/>
<UnitName Value="mdvMain"/>
</Unit1>
<Unit2>
<Filename Value="..\..\fpemakernotesanyo.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="fpeMakerNoteSanyo"/>
</Unit2>
</Units>
</ProjectOptions>
<CompilerOptions>

View File

@ -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}

View File

@ -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);

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="10"/>
<Version Value="11"/>
<PathDelim Value="\"/>
<General>
<SessionStorage Value="InProjectDir"/>
@ -18,9 +18,10 @@
<Version Value="2"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
</local>
<FormatVersion Value="2"/>
<Modes Count="1">
<Mode0 Name="default"/>
</Modes>
</RunParams>
<RequiredPackages Count="2">
<Item1>

View File

@ -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

View File

@ -6,7 +6,7 @@ interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls, fpeMetadata;
ExtCtrls, fpeMetadata, fpeMakerNote;
type

View File

@ -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

View File

@ -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;

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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 ***

View File

@ -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;

View File

@ -12,7 +12,7 @@
<Description Value="Library for displaying and editing of meta data (EXIF, IPTC) in images."/>
<License Value="LGPL with linking exception (like Lazarus)"/>
<Version Minor="1"/>
<Files Count="12">
<Files Count="19">
<Item1>
<Filename Value="fpeglobal.pas"/>
<UnitName Value="fpeGlobal"/>
@ -61,6 +61,34 @@
<Filename Value="fpemakernote.pas"/>
<UnitName Value="fpeMakerNote"/>
</Item12>
<Item13>
<Filename Value="fpemakernotenikon.pas"/>
<UnitName Value="fpeMakerNoteNikon"/>
</Item13>
<Item14>
<Filename Value="fpemakernotecanoncasio.pas"/>
<UnitName Value="fpeMakerNoteCanonCasio"/>
</Item14>
<Item15>
<Filename Value="fpemakernoteminolta.pas"/>
<UnitName Value="fpeMakerNoteMinolta"/>
</Item15>
<Item16>
<Filename Value="fpemakernoteolympus.pas"/>
<UnitName Value="fpeMakerNoteOlympus"/>
</Item16>
<Item17>
<Filename Value="fpemakernoteepson.pas"/>
<UnitName Value="fpeMakerNoteEpson"/>
</Item17>
<Item18>
<Filename Value="fpemakernotefuji.pas"/>
<UnitName Value="fpeMakerNoteFuji"/>
</Item18>
<Item19>
<Filename Value="fpemakernotesanyo.pas"/>
<UnitName Value="fpemakernotesanyo"/>
</Item19>
</Files>
<i18n>
<EnableI18N Value="True"/>

View File

@ -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

View File

@ -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"

View File

@ -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 ""