Свойства файла GPS (FMX) - PullRequest
1 голос
/ 24 марта 2019

Я могу найти основные свойства файла с System.IOUtils.TFile, такие как размер, дата и т. Д. Но я не могу понять, как получить координаты GPS из JPEG (широта и долгота) в моем приложении C ++ Builder FMX для WIN32 ,

Я могу сделать это с помощью консольного приложения на основе этого примера GDI + от Microsoft. Я просто не могу понять, как сделать это на уровне System.IOUtils.TFile. Я не хочу запускать консольное приложение для получения данных GPS, если не нужно.

1 Ответ

1 голос
/ 25 марта 2019

Вы можете открыть данные exif самостоятельно ... Это мой древний C ++ / VCL код, который делает так:

AnsiString exif_datetime(AnsiString file)
    {
    AnsiString t="";
    int hnd,adr,siz;
    BYTE *dat;
    hnd=FileOpen(file,fmOpenRead);
    if (hnd<0) return t;
    siz=FileSeek(hnd,0,2);
        FileSeek(hnd,0,0);
    dat=new BYTE[siz];
    if (dat==NULL) { FileClose(hnd); return t; }
    siz=FileRead(hnd,dat,siz);
    FileClose(hnd);

    for (adr=0;adr<siz-4;adr++)
        {
        if (dat[adr+0]=='E')
        if (dat[adr+1]=='x')
        if (dat[adr+2]=='i')
        if (dat[adr+3]=='f')
        if (dat[adr+4]== 0 )    // Exif header found
            {
            for (;adr<siz-18;adr++)
                {
                int e=1;
                char a; // "2008:07:17 19:19:10"
                a=dat[adr+ 0]; if ((a<'0')||(a>'9')) e=0;
                a=dat[adr+ 1]; if ((a<'0')||(a>'9')) e=0;
                a=dat[adr+ 2]; if ((a<'0')||(a>'9')) e=0;
                a=dat[adr+ 3]; if ((a<'0')||(a>'9')) e=0;
                a=dat[adr+ 4]; if (a!=':') e=0;
                a=dat[adr+ 5]; if ((a<'0')||(a>'9')) e=0;
                a=dat[adr+ 6]; if ((a<'0')||(a>'9')) e=0;
                a=dat[adr+ 7]; if (a!=':') e=0;
                a=dat[adr+ 8]; if ((a<'0')||(a>'9')) e=0;
                a=dat[adr+ 9]; if ((a<'0')||(a>'9')) e=0;
                a=dat[adr+10]; if (a!=' ') e=0;
                a=dat[adr+11]; if ((a<'0')||(a>'9')) e=0;
                a=dat[adr+12]; if ((a<'0')||(a>'9')) e=0;
                a=dat[adr+13]; if (a!=':') e=0;
                a=dat[adr+14]; if ((a<'0')||(a>'9')) e=0;
                a=dat[adr+15]; if ((a<'0')||(a>'9')) e=0;
                a=dat[adr+16]; if (a!=':') e=0;
                a=dat[adr+17]; if ((a<'0')||(a>'9')) e=0;
                a=dat[adr+18]; if ((a<'0')||(a>'9')) e=0;
                if (e)
                    {
                    for (e=0;e<19;e++) t+=char(dat[adr+e]);
                    break;
                    }
                }
            break;
            }
        }

    delete[] dat;
    return t;
    }

Он открывается и загружается JPG в память, отсканируйте структуру EXIF ​​ и, если найдена дата возврата времени из нее ...

Так что просто извлеките информацию, которую вы хотите вместо даты / времени ... о том, как это сделать, посмотрите:

Это первые спецификации формата файла, которые я нашел (из вики).

В случаеу вас есть большие изображения, EXIF ​​в JPG обычно помещается в начало файла, поэтому вам не нужно загружать все изображение в память только несколькими первыми (K) байтами ...

...