Как информация GPS хранится в файле RAW?

908
Lord Loh.

Я пытаюсь проанализировать файл Nikon RAW с помощью библиотеки LibRAW. Библиотека дает мне 32 байта массива данных GPS. Мне не удалось найти какую-либо документацию, которая объясняет, как интерпретировать этот массив 32 x int.

Вот пример данных GPS, которые я извлек -

GPS:32 GPS:1 GPS:112393 GPS:10000 GPS:0 GPS:1 GPS:104 GPS:1 GPS:253126 GPS:10000 GPS:0 GPS:1 GPS:18 GPS:1 GPS:35 GPS:1 GPS:4800 GPS:100 GPS:1204 GPS:1 GPS:538976288 GPS:538976288 GPS:32 GPS:875638834 GPS:976302138 GPS:13361 GPS:0 GPS:0 GPS:0 GPS:78 GPS:87 GPS:0 
2
Помогает ли [это] (http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/GPS.html)? Rik 10 лет назад 0
Нет :-(. Хотя это полезно, это не помогает мне разобрать `unsigned int [32]`, с которым я имею дело. Lord Loh. 10 лет назад 0

1 ответ на вопрос

1
Rik

Ну ... я не мог найти какой - либо документации о unsigned int [32]ФОР gpsdata.

Я нашел некоторый фрагмент кода здесь от источника LibRaw.
Посмотрите на parse_gps. Этот код анализирует информацию Exif в gpsdata[32]массиве.

#define FORC(cnt) for (c=0; c < cnt; c++) ... void CLASS parse_gps (int base) { unsigned entries, tag, type, len, save, c;  entries = get2(); while (entries--) { tiff_get (base, &tag, &type, &len, &save); switch (tag) { case 1: case 3: case 5: gpsdata[29+tag/2] = getc(ifp); break; case 2: case 4: case 7: FORC(6) gpsdata[tag/3*6+c] = get4(); break; case 6: FORC(2) gpsdata[18+c] = get4(); break; case 18: case 29: fgets ((char *) (gpsdata+14+tag/3), MIN(len,12), ifp); } fseek (ifp, save, SEEK_SET); } } 

Прости, что у меня нет знаний по С ++ ... но с помощью этого источника я обнаружил, что

GPSLatitudeRef = gpsdata[29+1/2] (Exif tag 0x0001) = [29] 1 char GPSLongitudeRef = gpsdata[29+3/2] (Exif tag 0x0003) = [30] 1 char GPSAltitudeRef = gpsdata[29+5/2] (Exif tag 0x0005) = [31] 1 char  GPSLatitude = gpsdata[2/3*6+c] (Exif tag 0x0002) = [ 0] 6 int GPSLongitude = gpsdata[4/3*6+c] (Exif tag 0x0004) = [ 6] 6 int GPSTimeStamp = gpsdata[7/3*6+c] (Exif tag 0x0007) = [12] 6 int  GPSAltitude = gpsdata[18+c] (Exif tag 0x0006) = [18] 2 int GPSMapDatum = gpsdata+14+18/3 (Exif tag 0x0012) = [20] 3 int GPSDateStamp = gpsdata+14+29/3 (Exif tag 0x001d) = [23] 3 int 

В вашем случае это будет означать:

00 GPS:32 GPSLatitude #1 01 GPS:1 #2 02 GPS:112393 #3 03 GPS:10000 #4 04 GPS:0 #5 05 GPS:1 #6 06 GPS:104 GPSLongitude #1 07 GPS:1 #2 08 GPS:253126 #3 09 GPS:10000 #4 10 GPS:0 #5 11 GPS:1 #6 12 GPS:18 GPSTimeStamp #1 13 GPS:1 #2 14 GPS:35 #3 15 GPS:1 #4 16 GPS:4800 #5 17 GPS:100 #6 18 GPS:1204 GPSAltitude #1 19 GPS:1 #2 20 GPS:538976288 GPSMapDatum #1 21 GPS:538976288 #2 22 GPS:32 #3 23 GPS:875638834 GPSDateStamp #1 24 GPS:976302138 #2 25 GPS:13361 #3 26 GPS:0 27 GPS:0 28 GPS:0 29 GPS:78 N GPSLatitudeRef 30 GPS:87 W GPSLongitudeRef 31 GPS:0 ? GPSAltitudeRef 

Это просто делается путем копания в исходном коде, так что прости любые ошибки ...

Я надеюсь, что это продвинет вас немного дальше.

Похожие вопросы