//====================================================================== // 機能:撮影機種名と撮影日付情報を取得する // (動作確認) Delphi 6, 2007, 10.4 //====================================================================== function GetPictureDate( FileName: string ): string; const Delphi2007 = TRUE; {Delphi2007以前ならTRUE、2009以降ならFALSE} var fpR: file; fbuf: array[0..4095] of AnsiChar; ii, jj, cnt: integer; maker, model, pdate: String; // 機能:ファイルの内容から指定位置と長さの文字列を返す function ExtractText( st,ln: integer ): String; {$IF Delphi2007} begin Result := Copy( StrPas(@fbuf[st]),1,ln ); {$ELSE} var ii: integer; begin Result := ''; for ii:=0 to ln-1 do begin if fbuf[st+ii]=#0 then break; Result := Result + String(fbuf[st+ii]); end; {$IFEND} end; // 機能:インテルフォーマットの情報取得 function GetDataI( ix: integer ): String; var len, pos: integer; begin len := Ord(fbuf[ix+4]); pos := Ord(fbuf[ix+8])+Ord(fbuf[ix+9])*$100+$C; Result := ExtractText( pos,len ); end; // 機能:モトローラフォーマットの情報取得 function GetDataM( ix: integer ): String; var len, pos: integer; begin len := Ord(fbuf[ix+7]); pos := Ord(fbuf[ix+10])*$100+Ord(fbuf[ix+11])+$C; Result := ExtractText( pos,len ); end; begin Result := '撮影情報の取得不可'; maker := ''; model := ''; pdate := ''; AssignFile( fpR,FileName ); Reset( fpR,1 ); BlockRead( fpR, fbuf, SizeOf(fbuf) ); CloseFile( fpR ); if ExtractText(6,4)='Exif' then begin // Exif形式のJPEGファイルなら if (fbuf[12]='I') and (fbuf[13]='I') then begin // インテルフォーマット cnt := Ord( fbuf[20] ); for ii:=0 to cnt-1 do begin jj := 12*ii + 22; if (fbuf[jj+0]=#$0F) and (fbuf[jj+1]=#$01) then maker := GetDataI( jj ); {メーカー情報} if (fbuf[jj+0]=#$10) and (fbuf[jj+1]=#$01) then model := GetDataI( jj ); {モデル情報} if (fbuf[jj+0]=#$32) and (fbuf[jj+1]=#$01) then pdate := GetDataI( jj ); {撮影日付情報} end; end; if (fbuf[12]='M') and (fbuf[13]='M') then begin // モトローラフォーマット cnt := Ord( fbuf[21] ); for ii:=0 to cnt-1 do begin jj := 12*ii + 22; if (fbuf[jj+1]=#$0F) and (fbuf[jj+0]=#$01) then maker := GetDataM( jj ); {メーカー情報} if (fbuf[jj+1]=#$10) and (fbuf[jj+0]=#$01) then model := GetDataM( jj ); {モデル情報} if (fbuf[jj+1]=#$32) and (fbuf[jj+0]=#$01) then pdate := GetDataM( jj ); {撮影日付情報} end; end; if pdate<>'' then Result := format( '機種=%s %s 撮影日付=%s',[maker,model,pdate] ); end; end; (2020/07/16 Delphi 10.4の場合を追加) |
・インターネット上の情報や書籍の内容を一部参考に作成してます。 ・コーディング内容は著作権フリーですが、使用する場合は自己責任にてお願いします。 ・記述内容に問題点や改善点がありましたらこちらまでお願いします。 |