[Delphi] デジカメデータから撮影情報を取得する
//======================================================================
//  機能:撮影機種名と撮影日付情報を取得する
//        (動作確認) 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の場合を追加)
      

・インターネット上の情報や書籍の内容を一部参考に作成してます。
・コーディング内容は著作権フリーですが、使用する場合は自己責任にてお願いします。
・記述内容に問題点や改善点がありましたらこちらまでお願いします。

サンプル集の一覧に戻る