我可以找到带有System.IOUtils.TFile
的文件的基本属性,例如大小,日期等。但是,我不知道如何在C ++ Builder FMX应用程序中从JPEG(纬度和经度)获取GPS坐标。对于WIN32。
我可以使用基于Microsoft的this GDI+ example的控制台应用程序来做到这一点。我只是不知道如何在System.IOUtils.TFile
级别进行此操作。我不想运行控制台应用程序以获取GPS数据(如果不需要的话)。
答案 0 :(得分:1)
您可以自己打开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)字节...