You've already forked lazarus-ccr
fpexif: Provide option to read exif without maker notes (not standardized and poorly documented feature).
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6091 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -115,18 +115,18 @@ object MainForm: TMainForm
|
|||||||
Height = 573
|
Height = 573
|
||||||
Top = 23
|
Top = 23
|
||||||
Width = 647
|
Width = 647
|
||||||
ActivePage = PgImage
|
ActivePage = PgMetadata
|
||||||
Align = alClient
|
Align = alClient
|
||||||
TabIndex = 1
|
TabIndex = 0
|
||||||
TabOrder = 1
|
TabOrder = 1
|
||||||
OnChange = PageControl1Change
|
OnChange = PageControl1Change
|
||||||
object PgMetadata: TTabSheet
|
object PgMetadata: TTabSheet
|
||||||
Caption = 'Meta data'
|
Caption = 'Meta data'
|
||||||
ClientHeight = 640
|
ClientHeight = 545
|
||||||
ClientWidth = 639
|
ClientWidth = 639
|
||||||
object TagListView: TListView
|
object TagListView: TListView
|
||||||
Left = 0
|
Left = 0
|
||||||
Height = 640
|
Height = 525
|
||||||
Top = 0
|
Top = 0
|
||||||
Width = 639
|
Width = 639
|
||||||
Align = alClient
|
Align = alClient
|
||||||
@ -155,6 +155,31 @@ object MainForm: TMainForm
|
|||||||
OnCompare = TagListViewCompare
|
OnCompare = TagListViewCompare
|
||||||
OnSelectItem = TagListViewSelectItem
|
OnSelectItem = TagListViewSelectItem
|
||||||
end
|
end
|
||||||
|
object Panel1: TPanel
|
||||||
|
Left = 0
|
||||||
|
Height = 20
|
||||||
|
Top = 525
|
||||||
|
Width = 639
|
||||||
|
Align = alBottom
|
||||||
|
AutoSize = True
|
||||||
|
BevelOuter = bvNone
|
||||||
|
ClientHeight = 20
|
||||||
|
ClientWidth = 639
|
||||||
|
TabOrder = 1
|
||||||
|
object CbDecodeMakerNotes: TCheckBox
|
||||||
|
AnchorSideLeft.Control = Panel1
|
||||||
|
AnchorSideTop.Control = Panel1
|
||||||
|
AnchorSideTop.Side = asrCenter
|
||||||
|
Left = 0
|
||||||
|
Height = 19
|
||||||
|
Top = 1
|
||||||
|
Width = 127
|
||||||
|
Caption = 'Decode MakerNotes'
|
||||||
|
Checked = True
|
||||||
|
State = cbChecked
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
object PgImage: TTabSheet
|
object PgImage: TTabSheet
|
||||||
Caption = 'Image'
|
Caption = 'Image'
|
||||||
@ -162,7 +187,7 @@ object MainForm: TMainForm
|
|||||||
ClientWidth = 639
|
ClientWidth = 639
|
||||||
object Image: TImage
|
object Image: TImage
|
||||||
Left = 0
|
Left = 0
|
||||||
Height = 517
|
Height = 545
|
||||||
Top = 0
|
Top = 0
|
||||||
Width = 639
|
Width = 639
|
||||||
Align = alClient
|
Align = alClient
|
||||||
@ -171,40 +196,16 @@ object MainForm: TMainForm
|
|||||||
Stretch = True
|
Stretch = True
|
||||||
StretchOutEnabled = False
|
StretchOutEnabled = False
|
||||||
end
|
end
|
||||||
object Panel1: TPanel
|
|
||||||
Left = 0
|
|
||||||
Height = 28
|
|
||||||
Top = 517
|
|
||||||
Width = 639
|
|
||||||
Align = alBottom
|
|
||||||
AutoSize = True
|
|
||||||
BevelOuter = bvNone
|
|
||||||
ClientHeight = 28
|
|
||||||
ClientWidth = 639
|
|
||||||
TabOrder = 0
|
|
||||||
Visible = False
|
|
||||||
object CheckBox1: TCheckBox
|
|
||||||
AnchorSideLeft.Control = Panel1
|
|
||||||
AnchorSideTop.Control = Panel1
|
|
||||||
AnchorSideTop.Side = asrCenter
|
|
||||||
Left = 0
|
|
||||||
Height = 19
|
|
||||||
Top = 5
|
|
||||||
Width = 127
|
|
||||||
BorderSpacing.Top = 4
|
|
||||||
BorderSpacing.Bottom = 4
|
|
||||||
Caption = 'Decode MakerNotes'
|
|
||||||
TabOrder = 0
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
object Messages: TMemo
|
object Messages: TMemo
|
||||||
Left = 0
|
Left = 4
|
||||||
Height = 90
|
Height = 90
|
||||||
Top = 596
|
Top = 596
|
||||||
Width = 647
|
Width = 639
|
||||||
Align = alBottom
|
Align = alBottom
|
||||||
|
BorderSpacing.Left = 4
|
||||||
|
BorderSpacing.Right = 4
|
||||||
TabOrder = 2
|
TabOrder = 2
|
||||||
end
|
end
|
||||||
object Splitter3: TSplitter
|
object Splitter3: TSplitter
|
||||||
|
@ -14,7 +14,7 @@ type
|
|||||||
{ TMainForm }
|
{ TMainForm }
|
||||||
|
|
||||||
TMainForm = class(TForm)
|
TMainForm = class(TForm)
|
||||||
CheckBox1: TCheckBox;
|
CbDecodeMakerNotes: TCheckBox;
|
||||||
FilenameInfo: TLabel;
|
FilenameInfo: TLabel;
|
||||||
Image: TImage;
|
Image: TImage;
|
||||||
Messages: TMemo;
|
Messages: TMemo;
|
||||||
@ -114,6 +114,10 @@ begin
|
|||||||
FImgInfo := TImgInfo.Create;
|
FImgInfo := TImgInfo.Create;
|
||||||
try
|
try
|
||||||
try
|
try
|
||||||
|
if CbDecodeMakerNotes.Checked then
|
||||||
|
FImgInfo.MetadataKinds := FImgInfo.MetadataKinds + [mdkExif] - [mdkExifNoMakerNotes]
|
||||||
|
else
|
||||||
|
FImgInfo.MetadataKinds := FImgInfo.MetadataKinds - [mdkExif] + [mdkExifNoMakerNotes];
|
||||||
FImgInfo.LoadFromFile(AFileName);
|
FImgInfo.LoadFromFile(AFileName);
|
||||||
Messages.Hide;
|
Messages.Hide;
|
||||||
except
|
except
|
||||||
|
@ -411,6 +411,7 @@ begin
|
|||||||
Move(AData[0], FExifVersion[1], Length(FExifVersion));
|
Move(AData[0], FExifVersion[1], Length(FExifVersion));
|
||||||
end;
|
end;
|
||||||
FULLTAG_MAKERNOTE:
|
FULLTAG_MAKERNOTE:
|
||||||
|
if FImgInfo.MetadataKinds * [mdkExif, mdkExifNoMakerNotes] = [mdkExif] then
|
||||||
begin
|
begin
|
||||||
// The stream is at the end of the makernote data area --> rewind it to start
|
// The stream is at the end of the makernote data area --> rewind it to start
|
||||||
AStream.Position := AStream.Position - Length(AData);
|
AStream.Position := AStream.Position - Length(AData);
|
||||||
|
@ -12,7 +12,12 @@ uses
|
|||||||
Classes, SysUtils;
|
Classes, SysUtils;
|
||||||
|
|
||||||
type
|
type
|
||||||
TMetaDataKind = (mdkExif, mdkIPTC, mdkComment);
|
TMetaDataKind = (
|
||||||
|
mdkExif, // Complete Exif (incl MakerNotes)
|
||||||
|
mdkExifNoMakerNotes, // Exif without MakerNotes (instead of mdkExif)
|
||||||
|
mdkIPTC, // IPTC
|
||||||
|
mdkComment // Comment segment
|
||||||
|
);
|
||||||
TMetaDataKinds = set of TMetaDataKind;
|
TMetaDataKinds = set of TMetaDataKind;
|
||||||
|
|
||||||
const
|
const
|
||||||
|
@ -459,7 +459,7 @@ begin
|
|||||||
p := AStream.Position;
|
p := AStream.Position;
|
||||||
case marker of
|
case marker of
|
||||||
M_EXIF:
|
M_EXIF:
|
||||||
if (mdkEXIF in FMetadataKinds) then begin
|
if FMetaDataKinds * [mdkExif, mdkExifNoMakerNotes] <> [] then begin
|
||||||
reader := TExifReader.Create(self);
|
reader := TExifReader.Create(self);
|
||||||
try
|
try
|
||||||
if not TExifReader(reader).ReadExifHeader(AStream) then
|
if not TExifReader(reader).ReadExifHeader(AStream) then
|
||||||
@ -647,7 +647,7 @@ begin
|
|||||||
AStream.WriteBuffer(SOI_MARKER, SizeOf(SOI_MARKER));
|
AStream.WriteBuffer(SOI_MARKER, SizeOf(SOI_MARKER));
|
||||||
|
|
||||||
// No Exif --> write an APP0 segment
|
// No Exif --> write an APP0 segment
|
||||||
if not HasExif or not (mdkExif in FMetadataKinds) then begin
|
if not HasExif or (FMetadataKinds * [mdkExif, mdkExifNoMakerNotes] = []) then begin
|
||||||
if Length(FHeaderSegment) = 0 then begin
|
if Length(FHeaderSegment) = 0 then begin
|
||||||
Move(JFIF[1], {%H-}JFIFSegment.Identifier[0], Length(JFIF));
|
Move(JFIF[1], {%H-}JFIFSegment.Identifier[0], Length(JFIF));
|
||||||
JFIFSegment.JFIFVersion[0] := 1;
|
JFIFSegment.JFIFVersion[0] := 1;
|
||||||
|
Reference in New Issue
Block a user