BSOne.SFC/EM.Lib/ImageEn_SRC/Demos/InputOutput/EXIF/umain.pas

405 lines
16 KiB
Plaintext
Raw Permalink Blame History

unit umain;
{$WARN UNIT_PLATFORM OFF}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, ieview, ImageEnView,
FileCtrl, StdCtrls, ImageEnIO, ComCtrls, ExtCtrls, hyieutils, hyiedefs, math, iexBitmaps, iesettings,
iexLayers, iexRulers;
type
TMainForm = class(TForm)
StringGrid1: TStringGrid;
Panel2: TPanel;
ImageEnView1: TImageEnView;
ProgressBar1: TProgressBar;
DriveComboBox1: TDriveComboBox;
DirectoryListBox1: TDirectoryListBox;
FileListBox1: TFileListBox;
btnSaveChanges: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
btnViewMakerNote: TButton;
lblMethod: TLabel;
cmbMethod: TComboBox;
procedure FormCreate(Sender: TObject);
procedure FileListBox1Change(Sender: TObject);
procedure ImageEnView1Progress(Sender: TObject; per: Integer);
procedure btnSaveChangesClick(Sender: TObject);
procedure btnViewMakerNoteClick(Sender: TObject);
procedure cmbMethodChange(Sender: TObject);
private
{ Private declarations }
procedure UpdateDisplay;
// Use standard TImageEnIO.Params properties
procedure ReadParameters_Method1;
procedure WriteParameters_Method1;
// Use helper methods in iexMetaHelpers
procedure ReadParameters_Method2;
procedure WriteParameters_Method2;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
uses
umakernote, iexMetaHelpers;
{$R *.DFM}
{$R WindowsTheme.res}
const
// Items of cmbMethod
_ieStandardImageEnProperties = 0;
_ieHelperMethods = 1;
procedure DecimalToFract(value: double; AllowedDecimals: integer; var num, den: integer);
var
d, i: integer;
ex: boolean;
begin
d := trunc(Power(10, AllowedDecimals));
num := trunc(value * d);
den := d;
repeat
ex := true;
for i := 10 downto 2 do
if ((num mod i) = 0) and ((den mod i) = 0) then
begin
num := num div i;
den := den div i;
ex := false;
end;
until ex;
end;
function DecimalToFractStr(value: double): string;
var
num, den: integer;
begin
DecimalToFract(value, 6, num, den);
result := inttostr(num) + '/' + inttostr(den);
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
IEAutoLoadIOPlugins;
FileListBox1.Mask := EXIF_COMPATIBLE_EXTENSIONS;
cmbMethod.ItemIndex := _ieStandardImageEnProperties;
end;
procedure TMainForm.FileListBox1Change(Sender: TObject);
begin
UpdateDisplay;
end;
// File selection has changed. Load EXIF data
procedure TMainForm.UpdateDisplay;
begin
if IsKnownFormat(FileListBox1.FileName) then
begin
// load only parameters
ImageEnView1.IO.ParamsFromFile(FileListBox1.FileName);
if assigned(ImageEnView1.IO.Params.EXIF_Bitmap) and not ImageEnView1.IO.Params.EXIF_Bitmap.IsEmpty then
begin
// there is a thumbnail, display it
ImageEnView1.IEBitmap.Assign( ImageEnView1.IO.Params.EXIF_Bitmap );
ImageEnView1.Update;
end
else
begin
// we need only a thumbnail (fast load)
ImageEnView1.IO.Params.GetThumbnail:=true;
ImageEnView1.io.LoadFromFile(FileListBox1.FileName);
end;
ProgressBar1.Position := 0;
case cmbMethod.ItemIndex of
_ieStandardImageEnProperties : ReadParameters_Method1;
_ieHelperMethods : ReadParameters_Method2;
end;
end
else
begin
ImageEnView1.Blank;
StringGrid1.ClearGridFields;
end;
end;
// Loading progress
procedure TMainForm.ImageEnView1Progress(Sender: TObject; per: Integer);
begin
ProgressBar1.Position := per;
end;
// Save changes
procedure TMainForm.btnSaveChangesClick(Sender: TObject);
begin
case cmbMethod.ItemIndex of
_ieStandardImageEnProperties : WriteParameters_Method1;
_ieHelperMethods : WriteParameters_Method2;
end;
// Save to file
case ImageEnView1.IO.Params.FileType of
ioJPEG : ImageEnView1.IO.InjectJpegEXIF(FileListBox1.FileName);
ioTIFF : ImageEnView1.IO.InjectTIFFEXIF(FileListBox1.FileName);
end;
ProgressBar1.Position := 0;
end;
procedure TMainForm.ReadParameters_Method1;
const
EXIF_Prop_Count = 62;
var
I: Integer;
begin
// initialize properties grid
StringGrid1.RowCount := StringGrid1.FixedRows + EXIF_Prop_Count;
StringGrid1.Cells[0, 0] := 'Property';
StringGrid1.Cells[1, 0] := 'Value';
with ImageEnView1.IO.Params do
begin
StringGrid1.Cells[0, 1] := 'Image Description';
StringGrid1.Cells[1, 1] := EXIF_ImageDescription;
StringGrid1.Cells[0, 2] := 'Make';
StringGrid1.Cells[1, 2] := EXIF_Make;
StringGrid1.Cells[0, 3] := 'Model';
StringGrid1.Cells[1, 3] := EXIF_Model;
StringGrid1.Cells[0, 4] := 'Orientation';
StringGrid1.Cells[1, 4] := IntToStr(EXIF_Orientation);
StringGrid1.Cells[0, 5] := 'X Resolution';
StringGrid1.Cells[1, 5] := floattostr(EXIF_XResolution);
StringGrid1.Cells[0, 6] := 'Y Resolution';
StringGrid1.Cells[1, 6] := FloatToStr(EXIF_YResolution);
StringGrid1.Cells[0, 7] := 'Software';
StringGrid1.Cells[1, 7] := EXIF_Software;
StringGrid1.Cells[0, 8] := 'Date/Time';
StringGrid1.Cells[1, 8] := EXIF_DateTime;
StringGrid1.Cells[0, 9] := 'Copyright';
StringGrid1.Cells[1, 9] := EXIF_Copyright;
StringGrid1.Cells[0, 10] := 'Exposure Time';
StringGrid1.Cells[1, 10] := DecimalToFractStr(EXIF_ExposureTime) + ' sec';
StringGrid1.Cells[0, 11] := 'F-Number';
StringGrid1.Cells[1, 11] := FloatToStr(EXIF_FNumber);
StringGrid1.Cells[0, 12] := 'Exposure Program';
StringGrid1.Cells[1, 12] := IntToStr(EXIF_ExposureProgram);
StringGrid1.Cells[0, 13] := 'Exif Version';
StringGrid1.Cells[1, 13] := EXIF_ExifVersion;
StringGrid1.Cells[0, 14] := 'Date/Time Original';
StringGrid1.Cells[1, 14] := EXIF_DateTimeOriginal;
StringGrid1.Cells[0, 15] := 'Date/Time Digitized';
StringGrid1.Cells[1, 15] := EXIF_DateTimeDigitized;
StringGrid1.Cells[0, 16] := 'Compressed Bits Per Pixel';
StringGrid1.Cells[1, 16] := FloatToStr(EXIF_CompressedBitsPerPixel);
StringGrid1.Cells[0, 17] := 'Shutter Speed Value';
StringGrid1.Cells[1, 17] := FloatToStr(EXIF_ShutterSpeedValue);
StringGrid1.Cells[0, 18] := 'Aperture Value';
StringGrid1.Cells[1, 18] := FloatToStr(EXIF_ApertureValue);
StringGrid1.Cells[0, 19] := 'Brightness Value';
StringGrid1.Cells[1, 19] := FloatToStr(EXIF_BrightnessValue);
StringGrid1.Cells[0, 20] := 'Exposure Bias Value';
StringGrid1.Cells[1, 20] := FloatToStr(EXIF_ExposureBiasValue);
StringGrid1.Cells[0, 21] := 'Max Aperture Value';
StringGrid1.Cells[1, 21] := FloatToStr(EXIF_MaxApertureValue);
StringGrid1.Cells[0, 22] := 'Subject Distance';
StringGrid1.Cells[1, 22] := FloatToStr(EXIF_SubjectDistance);
StringGrid1.Cells[0, 23] := 'Metering Mode';
StringGrid1.Cells[1, 23] := IntToStr(EXIF_MeteringMode);
StringGrid1.Cells[0, 24] := 'Light Source';
StringGrid1.Cells[1, 24] := IntToStr(EXIF_LightSource);
StringGrid1.Cells[0, 25] := 'Flash';
StringGrid1.Cells[1, 25] := IntToStr(EXIF_Flash);
StringGrid1.Cells[0, 26] := 'Focal Length';
StringGrid1.Cells[1, 26] := FloatToStr(EXIF_FocalLength);
StringGrid1.Cells[0, 27] := 'Subsec Time';
StringGrid1.Cells[1, 27] := EXIF_SubsecTime;
StringGrid1.Cells[0, 28] := 'Subsec Time Original';
StringGrid1.Cells[1, 28] := EXIF_SubsecTimeOriginal;
StringGrid1.Cells[0, 29] := 'Subsec Time Digitized';
StringGrid1.Cells[1, 29] := EXIF_SubsecTimeDigitized;
StringGrid1.Cells[0, 30] := 'FlashPix Version';
StringGrid1.Cells[1, 30] := EXIF_FlashPixVersion;
StringGrid1.Cells[0, 31] := 'Color Space';
StringGrid1.Cells[1, 31] := IntToStr(EXIF_ColorSpace);
StringGrid1.Cells[0, 32] := 'Exif Image Width';
StringGrid1.Cells[1, 32] := IntToStr(EXIF_ExifImageWidth);
StringGrid1.Cells[0, 33] := 'Exif Image Height';
StringGrid1.Cells[1, 33] := IntToStr(EXIF_ExifImageHeight);
StringGrid1.Cells[0, 34] := 'Related Sound File';
StringGrid1.Cells[1, 34] := EXIF_RelatedSoundFile;
StringGrid1.Cells[0, 35] := 'FocalPlane X Resolution';
StringGrid1.Cells[1, 35] := FloatToStr(EXIF_FocalPlaneXResolution);
StringGrid1.Cells[0, 36] := 'FocalPlane Y Resolution';
StringGrid1.Cells[1, 36] := FloatToStr(EXIF_FocalPlaneYResolution);
StringGrid1.Cells[0, 37] := 'FocalPlane Resolution Unit';
StringGrid1.Cells[1, 37] := IntToStr(EXIF_FocalPlaneResolutionUnit);
StringGrid1.Cells[0, 38] := 'Exposure Index';
StringGrid1.Cells[1, 38] := FloatToStr(EXIF_ExposureIndex);
StringGrid1.Cells[0, 39] := 'Sensing Method';
StringGrid1.Cells[1, 39] := IntToStr(EXIF_SensingMethod);
StringGrid1.Cells[0, 40] := 'File Source';
StringGrid1.Cells[1, 40] := IntToStr(EXIF_FileSource);
StringGrid1.Cells[0, 41] := 'Scene Type';
StringGrid1.Cells[1, 41] := IntToStr(EXIF_SceneType);
StringGrid1.Cells[0, 42] := 'User Comment';
StringGrid1.Cells[1, 42] := EXIF_UserComment;
StringGrid1.Cells[0, 43] := 'Camera Owner Name';
StringGrid1.Cells[1, 43] := EXIF_CameraOwnerName;
StringGrid1.Cells[0, 44] := 'Body Serial Number';
StringGrid1.Cells[1, 44] := EXIF_BodySerialNumber;
StringGrid1.Cells[0, 45] := 'Lens Make';
StringGrid1.Cells[1, 45] := EXIF_LensMake;
StringGrid1.Cells[0, 46] := 'Lens Model';
StringGrid1.Cells[1, 46] := EXIF_LensModel;
StringGrid1.Cells[0, 47] := 'Lens Serial Number';
StringGrid1.Cells[1, 47] := EXIF_LensSerialNumber;
StringGrid1.Cells[0, 48] := 'Gamma';
StringGrid1.Cells[1, 48] := FloatToStr( EXIF_Gamma );
StringGrid1.Cells[0, 49] := 'Subject Area';
StringGrid1.Cells[1, 49] := IntToStr( EXIF_SubjectArea[ 0 ]);
for I := 1 to 3 do
StringGrid1.Cells[1, 49] := StringGrid1.Cells[1, 49] + ', ' + IntToStr( EXIF_SubjectArea[ I ]);
StringGrid1.Cells[0, 50] := 'Subject Location X';
StringGrid1.Cells[1, 50] := IntToStr( EXIF_SubjectLocationX );
StringGrid1.Cells[0, 51] := 'Subject Location Y';
StringGrid1.Cells[1, 51] := IntToStr( EXIF_SubjectLocationY );
StringGrid1.Cells[0, 52] := 'XP Title';
StringGrid1.Cells[1, 52] := WideCharToString(PWideChar(EXIF_XPTitle));
StringGrid1.Cells[0, 53] := 'XP Comment';
StringGrid1.Cells[1, 53] := WideCharToString(PWideChar(EXIF_XPComment));
StringGrid1.Cells[0, 54] := 'XP Author';
StringGrid1.Cells[1, 54] := WideCharToString(PWideChar(EXIF_XPAuthor));
StringGrid1.Cells[0, 55] := 'XP Keywords';
StringGrid1.Cells[1, 55] := WideCharToString(PWideChar(EXIF_XPKeywords));
StringGrid1.Cells[0, 56] := 'XP Subject';
StringGrid1.Cells[1, 56] := WideCharToString(PWideChar(EXIF_XPSubject));
StringGrid1.Cells[0, 57] := 'GPS Version ID';
StringGrid1.Cells[1, 57] := EXIF_GPSVersionID;
StringGrid1.Cells[0, 58] := 'GPS Datestamp';
StringGrid1.Cells[1, 58] := EXIF_GPSDateStamp;
StringGrid1.Cells[0, 59] := 'GPS Altitude';
StringGrid1.Cells[1, 59] := FloatToStr(EXIF_GPSAltitude);
StringGrid1.Cells[0, 60] := 'GPS Latitude';
StringGrid1.Cells[1, 60] := Format('%f<> %f'' %f'''' %s', [EXIF_GPSLatitudeDegrees, EXIF_GPSLatitudeMinutes, EXIF_GPSLatitudeSeconds, EXIF_GPSLatitudeRef]);
StringGrid1.Cells[0, 61] := 'GPS Longitude';
StringGrid1.Cells[1, 61] := Format('%f<> %f'' %f'''' %s', [EXIF_GPSLongitudeDegrees, EXIF_GPSLongitudeMinutes, EXIF_GPSLongitudeSeconds, EXIF_GPSLongitudeRef]);
// if there is no exif data then clear invalid values
if EXIF_HasEXIFData = False then
for I := 1 to StringGrid1.RowCount - 1 do
StringGrid1.Cells[1, I] := '';
end;
end;
// Only partially implemented...
procedure TMainForm.WriteParameters_Method1;
begin
with ImageEnView1.IO.Params do
begin
// Set flag that file contains EXIF information
EXIF_HasEXIFData := True;
EXIF_ImageDescription := StringGrid1.Cells[1, 1];
EXIF_Make := StringGrid1.Cells[1, 2];
EXIF_Model := StringGrid1.Cells[1, 3];
EXIF_Orientation := StrToIntDef(StringGrid1.Cells[1, 4], 0);
EXIF_XResolution := StrToIntDef(StringGrid1.Cells[1, 5], 0);
EXIF_YResolution := StrToIntDef(StringGrid1.Cells[1, 6], 0);
EXIF_Software := StringGrid1.Cells[1, 7];
EXIF_DateTime := StringGrid1.Cells[1, 8];
EXIF_Copyright := StringGrid1.Cells[1, 9];
// StringGrid1.Cells[1,10] := DecimalToFractStr(EXIF_ExposureTime)+' sec';
EXIF_FNumber := StrToFloat(StringGrid1.Cells[1, 11]);
EXIF_ExposureProgram := StrToIntDef(StringGrid1.Cells[1, 12], 0);
EXIF_ExifVersion := StringGrid1.Cells[1, 13];
EXIF_DateTimeOriginal := StringGrid1.Cells[1, 14];
EXIF_DateTimeDigitized := StringGrid1.Cells[1, 15];
// StringGrid1.Cells[1,16] := FloatToStr(EXIF_CompressedBitsPerPixel);
// StringGrid1.Cells[1,17] := FloatToStr(EXIF_ShutterSpeedValue);
// StringGrid1.Cells[1,18] := FloatToStr(EXIF_ApertureValue);
// StringGrid1.Cells[1,19] := FloatToStr(EXIF_BrightnessValue);
// StringGrid1.Cells[1,20] := FloatToStr(EXIF_ExposureBiasValue);
// StringGrid1.Cells[1,21] := FloatToStr(EXIF_MaxApertureValue);
// StringGrid1.Cells[1,22] := FloatToStr(EXIF_SubjectDistance);
// StringGrid1.Cells[1,23] := IntToStr(EXIF_MeteringMode);
// StringGrid1.Cells[1,24] := IntToStr(EXIF_LightSource);
// StringGrid1.Cells[1,25] := IntToStr(EXIF_Flash);
// StringGrid1.Cells[1,26] := FloatToStr(EXIF_FocalLength);
// StringGrid1.Cells[1,27] := EXIF_SubsecTime;
// StringGrid1.Cells[1,28] := EXIF_SubsecTimeOriginal;
// StringGrid1.Cells[1,29] := EXIF_SubsecTimeDigitized;
// StringGrid1.Cells[1,30] := EXIF_FlashPixVersion;
// StringGrid1.Cells[1,31] := IntToStr(EXIF_ColorSpace);
EXIF_ExifImageWidth := StrToIntDef(StringGrid1.Cells[1, 32], 0);
EXIF_ExifImageHeight := StrToIntDef(StringGrid1.Cells[1, 33], 0);
EXIF_RelatedSoundFile := StringGrid1.Cells[1, 34];
// StringGrid1.Cells[1,35] := FloatToStr(EXIF_FocalPlaneXResolution);
// StringGrid1.Cells[1,36] := FloatToStr(EXIF_FocalPlaneYResolution);
// StringGrid1.Cells[1,37] := IntToStr(EXIF_FocalPlaneResolutionUnit);
// StringGrid1.Cells[1,38] := FloatToStr(EXIF_ExposureIndex);
// StringGrid1.Cells[1,39] := IntToStr(EXIF_SensingMethod);
// StringGrid1.Cells[1,40] := IntToStr(EXIF_FileSource);
// StringGrid1.Cells[1,41] := IntToStr(EXIF_SceneType);
EXIF_CameraOwnerName := StringGrid1.Cells[1, 43];
EXIF_BodySerialNumber := StringGrid1.Cells[1, 44];
EXIF_LensMake := StringGrid1.Cells[1, 45];
EXIF_LensModel := StringGrid1.Cells[1, 46];
EXIF_LensSerialNumber := StringGrid1.Cells[1, 47];
// EXIF_Gamma := FloatToStr( StringGrid1.Cells[1, 48] );
// EXIF_SubjectArea := StringGrid1.Cells[0, 49];
EXIF_SubjectLocationX := StrToIntDef( StringGrid1.Cells[1, 50], -1 );
EXIF_SubjectLocationY := StrToIntDef( StringGrid1.Cells[1, 51], -1 );
EXIF_XPTitle := StringGrid1.Cells[1, 52];
EXIF_XPComment := StringGrid1.Cells[1, 53];
EXIF_XPAuthor := StringGrid1.Cells[1, 54];
EXIF_XPKeywords := StringGrid1.Cells[1, 55];
EXIF_XPSubject := StringGrid1.Cells[1, 56];
end;
end;
procedure TMainForm.ReadParameters_Method2;
begin
StringGrid1.ReadGridFromEXIF(ImageEnView1.IO.Params);
end;
procedure TMainForm.WriteParameters_Method2;
begin
StringGrid1.WriteGridToEXIF(ImageEnView1.IO.Params);
end;
// Read maker notes
procedure TMainForm.btnViewMakerNoteClick(Sender: TObject);
begin
fMakerNote.ShowModal;
end;
procedure TMainForm.cmbMethodChange(Sender: TObject);
begin
UpdateDisplay;
end;
end.