GPS 文件属性

问题描述 投票:0回答:1

我可以找到带有

System.IOUtils.TFile
的文件的基本属性,例如大小、日期等。但是,我无法弄清楚如何在我的 C++ Builder FMX 应用程序中的 WIN32 中从 JPEG(纬度和经度)获取 GPS 坐标。

我可以使用基于 Microsoft 的这个 GDI+ 示例 的控制台应用程序来完成此操作。我只是不知道如何在

System.IOUtils.TFile
级别上做到这一点。如果不需要的话,我不想运行控制台应用程序来获取 GPS 数据。

firemonkey c++builder
1个回答
2
投票

您可以自己打开 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结构,如果找到则返回日期时间...

因此,只需提取您想要的信息而不是日期时间......有关如何做到这一点,请参阅:

这是我发现的第一个文件格式规范(来自 wiki)。

如果您有大图像,JPG 中的 EXIF 通常放置在文件的开头,因此您不需要将整个图像加载到内存中,只需前几个 (K) 字节...

© www.soinside.com 2019 - 2024. All rights reserved.