안녕하세요~!

이번 포스팅은 JPG 파일의 GPS 정보에 관해서 포스팅을 진행해보겠습니다!

 

먼저 JPG파일의 구조에 대해서 간단히 정리하겠습니다!

 

1. JPG 구조

 

 SOI 
 APP0 JFIF Marker
 추가 APP Marker(App0 ~ App15)
 DQT
 SOF
 DHT
 SOS
 스캔 데이터
 EOI

기본적인 JPG 구조는 다음과 같습니다. 간단하게 각각의 내용에 대해서 설명하면...

 

1) SOI

SOI는 이미지의 시작을 알려주는 곳 입니다. Hex 값으로 0xFFD8 값을 가지며 FF D8을 보면 이미지의 시작 지점이라고 생각 하시면 됩니다.

 

2) App0 JFIF Marker, 추가 App Marker

이 부분은 다양한 applicaiton data가 존재하는 영역인데요 저희가 살펴 볼 GPS 정보 역시 이 부분에서 확인할 수 있습니다. App은 0~ 15까지의 번호가 있으며 각각의 App에 따라 시작을 알리는 Hex 값도 다릅니다. 기본적으로 0xFFEn의 값을 가지게 되는데..

간단히 예를들어

App1 인경우 FF E1

App2 인경우 FF E2

...

App15인 경우 FF EF의 Hex 값을 가지게 됩니다.

 

3) DQT

Quantization Table이 존재하는 영역입니다.

구성으로는 0xFFD8 이 DQT를 알리는 Hex입니다. 즉 SOI와 같아 혼란이 일어날 수 있으니 분석하실 때 주의하셔야 합니다!!

Qunatization은 Image Processing 에서 배우는 Level을 통해 데이터를 압축하는데 사용하는 방법입니다!

 

4) SOF

이 부분은 크기와 샘플링에 관한 정보를 보관하고 있는 곳입니다. 샘플링은 아날로그 데이터를 디지털로 변환과정에서 사용하는 기술로 SOF 구조에서는 Y, Cb, Cr을 사용합니다.

<Y, Cb, Cr,은 R, G, B 에서 사람의 시각을 고려하여 데이터를 압축한 형태로 쉽게 R, G, B와 비슷한 개념으로 이해하시면 됩니다.>

 

5) DHT

이 부분은 허프만 테이블에 관한 내용이 있습니다. 허프만 알고리즘 역시 압축에 사용되는 알고리즘 방법입니다.

 

6) SOS

scan data가 시작되는 것을 알리는 영역입니다. 이곳에는 scan을 구성하는 컴포턴트 개수 및 번호 등의 정보가 들어있습니다.

 

7) EOI

이미지의 끝을 알리는 부분으로 0xFFD9의 값을 가지고 있습니다.

 

-> COM

이 부분은 이미지 작성자가 달아놓은 주석입니다. 시작 Hex 값은 0xFFFE 입니다.

 

2. GPS

그럼 이제부터 본격적으로 사진 파일 내 GPS 정보를 얻어보겠습니다!

먼저 GPS정보가 들어있는 위치는 App1 부분에 위치하고 있습니다. 때문에 사진 파일을 HxD로 열었을 때, FF E1이 존재하지 않는다면...

해당 이미지에서 GPS 정보를 확인할 수 없습니다.

 

 

사진 파일을 HxD를 통해서 열면 가장 먼저 FF D8(SOI)를 보실 수 있습니다. 그리고 정상적으로 GPS 값이 저장되있는 사진의 경우 다음과 같이 App1의 시작을 알리는 FF E1을 확인하실 수 있습니다.

 

App1의 경우 Exif 구조로 이루어져 있습니다. Exif 구조는 간단히 설명하면 pack 안에 pack들이 존재하고 또 각각의 pack안에 pack이 존재하는 구성으로 되어있습니다. 가장 먼저 Exif의 시작을 알리는 EXIF 헤더(6Byte) 이후 TIFF Header가 나옵니다.

 

1) TIFF 

 

다음 8byte가 TIFF HEADER를 나타냅니다.

가장 먼저 나오는 2Byte는 TIFF Header에는 저장 방식이 Big / Little Endian인지에 대한 정보가 가장 먼저 나오게 됩니다.

 

Little - 0x4949

Big - 0x4D4D

 

다음의 2byte 2A 00을 지나 다음 4byte는 TIFF HEADER 다음에오는 IFD의 위치를 TIFF HEADER 첫 번째 바이트 기준으로 떨어진 거리를 의미합니다.

보통의 경우 TIFF HEADER 다음에 바로 IFD가 오기 때문에 다음과 같이 TIFF HEADER 길이와 같은 8 값이 나오게 됩니다.

 

2) IFD

IFD 가장 먼저 오는 2byte는 IFD Entry의 개수를 의미합니다.

IFD는 여러 개의 IFD entry의 집합으로 이루어져 있습니다. 그리고 각각의 IFD Entry는 12byte로 구성되며 마지막 IFD Entry 즉 IFD 마지막 부분 뒤에 오는 4Byte에는 다음 IFD 위치를 알려주거나 IFD Entry의 종료를 알려줍니다.

 

그리고 IFD Entry의 개수 이후 바로 다음 부터 12byte씩 IFD Entry에 대한 정보가 나오게 됩니다.

 

IFD Entry의 구조

2Byte 2Byte 4Byte 4Byte
태그 번호 Data type Component 개수 Data 위치

과 같습니다.

 

여기서 태그 번호는

https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html

사이트에서 참조하실 수 있습니다.

 

저희가 참조할 GPS TAG 번호는 0x8825 입니다.

여기서 우리가 리틀엔디안 방식으로 읽기 때문에 25 88 값을 태그 번호로 가지는 IFD Entry를 찾아내면 됩니다.

 

다음 IFD Entry의 Data 부분인 마지막 4byte 값을 바탕으로 IFD Entry의 Data가 존재하는 곳이 03 72 주소 값임을 알 수 있습니다.

 

마지막으로 데이터 주소 값을 바탕으로 IFD Entry Data가 위치하는 곳으로 이동했을 때, 각각의 IFD Entry는 IFD와 똑같은 구조로 처음 2byte는 IFD Entry의 개수 그리고 12byte씩 각각의 IFD Entry가 나열됩니다.

단, 여기서 나열되는 IFD Entry들은 GPS TAG 안에 존재하는 것으로 태그 값은 GPS 태그 값으로 갱신되어야 합니다.

 

GPS 내의 IFD Entry들의 태그 값에 대한정보는

https://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/GPS.html

에서 참조하실 수 있습니다.

 

03 72 에서 부터 IFD Entry 순회를 돌기 시작하면 처음 2byte는 Entry의 개수이므로 넘기고 12byte씩 순회합니다.

여기서 저희는 위도 값과 경도 값을 볼 것이기 때문에 태그 번호가 1, 2, 3, 4 인 것만 확인 하면 됩니다.

 

 

먼저 태그 번호가 1인 IFD Entry 입니다. 해당 Entry는 위도의 방향이 N인지 S인지를 나타내는 것으로 우측 ASCII를 통해서도 N 인것을 바로 확인 가능합니다. 정확한 좌표 내용은 태그 번호 2에 있습니다.

 

 

태그 번호 2에 대한 내용으로 위도 좌표 값이 들어있습니다. 여기서 데이터 타입이 Rational 인데...

Rational type이란 8byte를 기준으로 앞의 4byte / 뒤의 4yte로 나눗셈 연산을 진행한 값을 나타내는 데이터 저장 방식입니다.

정확한 좌표 값을 알기 위해 IFD Entry 마지막 4byte를 통해 Data 저장위치인 3E4로 이동하고 앞의 12byte를 버린 후 Rational 계산법을 적용하면

 

 

 

가장 먼저 37의 값을 얻고 다음 값으로 37 다음 값으로 11 값을 얻게 됩니다.

다시 말해 위도는 N 방향 37;37;11 값이 됩니다.

 

경도 값도 마찬가지로 계산하게 되는데 다시 GPS 내 IFD Entry 순회로 돌아와서 태그 번호가 3인 부분이 경도의 방향 E,W를 결정하는 것으로

 

그림과 같이 쉽게 E를 바로 확인할 수 있습니다.

 

 

마찬가지로 구체적인 경도의 좌표 값은 태그 번호 4에 저장되며 Data 저장위치인 03 FC 로 이동하면, 12byte 버리고 Rational type으로 계산하면

 

 

경도 값은 127;3;33이 되는 것을 확인할 수 있습니다

 

이 값은 사진 파일의 속성 정보를 통해 GPS 값을 비교 해보면

 

직접 파싱을 통해 구한 GPS 정보가 정확한 값임을 확인할 수 있습니다.

 

이상으로 포스터를 마치겠습니다.

감사합니다!!

 

+ Recent posts