1. 아별툴
  2. 아별툴 패밀리
  3. 엑셀 질문하기
  4. 엑셀 강좌
  5. 엑셀 팁
  6. 엑셀 자료실
  7. 엑셀 연구과제
  8. 엑셀 북마크
  9. 관련 프로그램 소개

안녕하세요?

주인장 아별입니다. ㅎㅎ

 

지난주 금요일에 얼씨구님이 가입하자 마자 묵직한 질문을 올리셔서..

주말에 좀 살펴보고.. 문제를 해결하여 VBA팁 게시물에 올려봅니다.

질문 게시물 : 사진에있는 GPS메타정보추출 방법 ? 

 

** 저는 프로그래머가 아닙니다. 제 정체성에 혼동을 주는 이런 질문.. 1년에 한번만해주세요.. 하하..

** 답변하는 저도 문제가 있군요.. ^__^;;;;;

** 엑셀로 이상한거 하지 마세요.. ㅎㅎ Exif 정보 보는 프로그램 많이 있습니다. ^_^;; ACDSee도 잘 보여주네요..

 

 

[ 배경 정보 ]

 

1. 인터넷에 공개된 ExifReader Class를 이용하여 사진의 Exif정보를 불러봤습니다.

    http://sourceforge.net/projects/exifclass/

   2009년 11월 23일자 자료인데요.. 다 좋은데.. GPS정보는 불러오질 못하네요..

   아마 개발자가 만들 당시에만해도 사진에 GPS정보는 없었나봅니다.

 

2. 몇몇 Exif 코드도 빠져있어서.. 제가 아래 사이트를 참고해서 상수 코드를 추가했습니다.

'### Reference Site..
'### Baseline Tags : http://www.awaresystems.be/imaging/tiff/tifftags/baseline.html
'### Private IFD Exif Tags : http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html
'### Private IFD GPS Tags : http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/gps.html

 

 

[ ExifReader 클래스의 알고리즘 분석 ]

 

쉽게 끝날 줄 알았는데.. 생각보다 오래걸리더라구요..

알고리즘이 더러웠습니다. =_=;;

로직이 더럽다기 보다는 이해하기 힘들었다는 말입니다. ㅠㅠ

(로직도 살짝 비효율적이더군요.. Intel인지 너무 자주 체크함.. 한번만 해도 될텐데..)

 

1. JPG 파일을 Binary로 읽어들입니다.

 

2. 작은 사진으로 테스트했는데도.. 59만개의 배열이 생기더라구요.. =_=;;

     581KB 그러니까.. 595,090바이트니까.. 그 대로 생기겠죠.. =_=;;

 

3. 차례로 파일을 검사합니다.

    첫번째 바이트로 JPG인지 검사를 합니다.

     6번부터 9번까지는 Exif 더라구요.. 숫자로 쓰지면.. 69,120,105,102 입니다. 각각 E, x, i, f 죠..

     이런게 다 있어야 JPG파일이고.. Exif 정보가 있다고 판단하고 데이터를 찾기 시작하는 겁니다..

 

4. 데이터 찾기..

    20번과 21번에 첫번째 Exif 묶음의 개수가 나옵니다.

    이넘의 파일이 Exif 정보를 연속으로 쭉~ 기록해 놓지 않았더라구요!

    테스트 파일에는 4덩어리나 따로 따로 떨어져 있어요! 그래서 각 덩어리가 시작하는 포인트를 검사하기 힘들었다구요!

 

    테스트 파일의 첫번째 덩어리는 11개의 Entry가 있었구요..

    각 Entry는 12바이트 단위로 되어 있습니다. ( Tag_No : 2Byte, Data_Format : 2Byte, Components Length : 4Byte, Offset or Value : 4Byte )

        -  Tag_No : 어떤 태그인지 나타내는 거죠.. Make, Model, ISO 등등의 태그 이름의 코드입니다.

        -  Data_Format : String, Raional, Byte, Short, Long 등등의 형이 있습니다.

                                    데이터의 유형에 따라 Value값을 찾아가는 방법이 달라요!

        -  Components Length : 데이터의 길이입니다. 문자열의 경우.. 몇 글자인지 알려주죠.. 데이터일 경우도 몇 바이트인지 알려줍니다.

                                   : 4Byte이하면 연속되는 다음 4Byte에 값을 담고.. 아니면 몇번째에 데이터가 있는지를 알려주는 주소를 담아놓습니다.

        - Offset or Value : 값이 4Byte 이내면 값을 담고.. 넘어가면 몇번째 Byte에 해당 값이 있는지를 알려주는 숫자가 있습니다.

 

     한 덩어리가 끝나는 지점의 4Byte에 다음 덩어리가 시작하는 정보를 넣어놓았을 수 있습니다.

     항상 값이 있는게 아니더라구요!

     만약 없으면.. 즉 값이 0이면.. ExifOffset 태그도 검사를 해야해서.. 그 지점으로 점프해야합니다.

 

5. 기존 클래스의 문제점!!

     로직을 따라가다보니까.. GPS 정보는 개 무시하는거예요!!

      그래서 봤더니.. 한 덩어리가 끝나는 지점에 다음 지점을 가리키는 주소가 없어서..

      ExifOffset 태그의 값을 참고해서.. 기본적인 Exif 정보는 모두 불러들이는데.. 거기서 끝나드라구요!

 

      GPS의 정보에 대한 고려는 안되어 있더군요..

      그래서 제가.. GPSInfo라는 Tag 값을 참고하게 코드를 수정했습니다.

 

6. 끝..

 

 

[ 다운 받기 ]

 

클래스를 수정한 파일을 공유합니다.

일요일 하루 종일 이것만 잡고 있어서.. 시간이 많이 들어서.. 그냥 공개하기 아깝다는 생각이 들지만.. 쿨럭..

그냥 공개합니다. 누가 밥 좀 사주세요.. ㅎㅎ

 

* 첨부파일에는 Byte단위로 알고리즘 추적한 과정도 포함되어 있으니.. 공부하시는 분들은 참고하세요..

* 첨부파일의 워크시트에 실행버튼이 있는데.. 버튼을 클릭하면.. 이미지를 선택하는 창이 뜹니다.

   이미지를 선택하면 그 사진의 Exif 정보를 새로운 워크시트에 뿌려줍니다.

 

다운 받기 : abyul.com_ExifData_20120225-8.xlsm

 

어떤 코드를 추가하고 수정했는지 확인하고 싶으시면..

아래의 문자열을 검색해서 보세요.. 수정한 내용에 아래처럼 주석을 붙여놨습니다.

'### added by abyul.com 2012.02.26

 

 

도움이 되셨기를..

 

 

아익후.. 벌써 새벽 2시반이네요.. ㅠㅠ

 

 

 

[ 참고.. 클래스 수정 전 후 ]

abyul.com_ExifData_20120227111039_0001.png



[ 이렇게 뽑아낸 GPS 정보를 어떻게 사용하나요.. ]


샘플 파일의 경우 아래의 위치 정보가 있습니다.

GPSLatitude 37/1,31/1,1113/50 

GPSLongitude 126/1,58/1,5406/125  


콤마(,)로 구분된 정보는 도,분,초입니다.

위도 정보(GPSLatitude)의 도분초는  37/1, 31/1, 1113/50입니다.

이것을 도 단위로 변경해야하는데요.. 도 + 분/60 + 초/3600 하시면 됩니다.

     위도 = 37 + 31/60 + (1113/50)/3600 = 37.52868


경도도 같은 로직으로 도로 환산하시면 됩니다.

     경도 = 126 + 58/60 + (5406/125)/3600 = 126.97868


이 위치를 지도상에서 확인하려면 어떻게 해야할까요?

네이버 지도와 구글맵을 사용하시면 됩니다. (다음맵은 사용 코드가 좀 다르네요..)

http://map.naver.com/?dlevel=14&lat=37.52285&lng=126.97868

http://maps.google.co.kr/maps?ll=37.52285,126.97868


용산 가족 공원에서 촬영한 사진인 것을 알 수 있습니다. ^__^)v



[ 알고리즘 분석을 위해 사용했던 샘플 파일 : 얼씨구님이 질문에 올려주셨던 파일이예요! ]

SAM_0069.jpg

 

 


'### 내용 추가.. 2013.04.12 =======================================================================

간단한 방법으로 기본 Exif정보를 볼 수 있는 팁을 황기성님이 공유해주신 게시물이 있어 링크합니다.

 Shell을 이용해 사진 촬영 일자 알아내기 

http://examo.co.kr/tn/board.php?board=qqqtip&command=body&no=1206

GPS정보는 없지만.. 기본 Exif정보를 쉽게 볼 수 있어 편리하네요..

'===============================================================================================





댓글 '6'

[레벨:1]얼씨구

2012.03.03 13:53:44
*.186.140.118

아별님! 위경도 표시방식을 도분초 방식에서

도표시 방식으로 표기하게 수정해봤습니다.

다른 회원님들께 도움이 될까싶어 올려봅니다.

첨부
profile

[레벨:30]아별

2012.03.04 17:40:38
*.104.126.21

얼씨구님~

첨부파일을 열어보진 않았지만..

직접 수정까지 하신걸 보니.. 코드는 다 이해하신 것 같네요..

어떤 코드든지 천천히 살펴보면 언젠간 이해하게 되어 있습니다. ^^

화이팅입니다!! ^^

[레벨:1]얼씨구

2012.03.04 23:06:43
*.186.140.118

클래스 모듈은 이해가 잘 안되네요.

감사합니다.

 

나그네1

2012.09.26 15:37:23
*.196.21.197

프로그래머가 아니면 뭐하는 분이세요?

 

실력이 좋으신거같은데 궁금해요

profile

[레벨:30]아별

2012.09.27 15:07:48
*.104.126.21

안녕하세요? 나그네님..

지나가다가 들르셨나봐요? ㅎㅎ

 

뭐.. 제 주업은 재무팀장입니다.

회사에서 회계를 담당하고 있습니다. 엑셀을 잘 하게 된 것에 대한 원인이라고 할 수 있죠.. 하하..

 

요즘은 취미 삼아 사진을 찍으면서 여유자적하게 다니고 있습니다만..

일전에는 영상 제작하는 프리랜서 생활을 잠깐 한 적이 있었죠.. ㅎㅎ

주로 행사 영상이나 강의 촬영등을 했었구요.. 2004년도엔 제가 만든 다큐멘터리가 EBS에서 방영된적도 있었죠.. ㅎㅎ

 

회사 들어와서 회계업무를 하다보니.. 엑셀을 많이 사용하게 되드라구요..

그래서 최적화 작업을 많이 했는데.. 그러다보니 어느새 엑셀의 신이.. ㅋㅋ

 

프로그래밍은 취미 삼아하고 있습니다. ㅎㅎ

가끔 필요한 기능이 있으면 직접 만들어 쓸 정도 밖에 안됩니다.

아직 배포, 버전관리, 암호화, 보호 등은 서툴구요..

 

프로그래밍도 나름 재밌습니다.

(취미로 할때는요.. 이게 일이 되면 피곤해질겁니다.. 아마도.. ㅎㅎ)

 

그럼.. 

지나가다가 종종 들르세요~ 나그네님.. ㅎㅎ

임종복

2016.07.11 01:12:42
*.226.244.171

좋은 정보 고맙습니다.

종종 들려야 겠네요

문서 첨부 제한 : 0Byte/ 2.00MB
파일 제한 크기 : 2.00MB (허용 확장자 : *.*)
List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 기타 엑셀 VBA 간단한 팁 모아놓기.. +_+ [레벨:30]아별 2007-01-24 33818
65 기타 [펌] 한글을 자음 모음으로 나누기 + 합치기(초성,중성,종성) [레벨:30]아별 2022-03-22 2373
64 기타 오피스2010 64bit(64비트)를 위한 API Declare 방법 _ 윈도우 도움말 file [레벨:30]아별 2017-04-21 39349
63 기타 [VBA] 컴퓨터 이름 알아내기 등 PC 환경 변수 읽오이기.. Environ [레벨:30]아별 2015-04-08 4398
62 기타 [VBA] 엑셀 파일을 PDF로 저장(EXPORT) 시키기 [1] [레벨:30]아별 2015-01-21 7342
61 기타 [펌] 추가 기능 개발시 리본메뉴에 넣을 MSO Image 쉽게 확인하기 imagefile [레벨:30]아별 2015-01-09 3432
60 기타 엑셀 2013에서 웹 브라우저 컨트롤(ActiveX, web browser)을 시트에 삽입할 수 없는 문제.. imagefile [레벨:30]아별 2014-01-19 7312
» 기타 [ VBA Tip ] 엑셀 VBA로 사진(JPG)의 EXIF 정보(GPS 포함) 불러 들이기.. imagefile [6] [레벨:30]아별 2012-02-27 7888
58 기타 VBA로 인디언식 이름 만들어주는 사용자 정의 함수 만들기.. imagefile [1] [레벨:30]아별 2012-01-11 5602
57 기타 오피스2010 64bit(64비트)를 위한 API Declare 방법 file [2] [레벨:30]아별 2011-10-05 9217
56 기타 [펌] VBA 공부를 시작하시는분들에게 추천하는 강의자료 imagefile [4] [레벨:30]아별 2011-03-21 13698
55 기타 VBA _ 레지스트리 다루기 ( registry control ) imagefile [레벨:30]아별 2011-03-19 8671
54 기타 엑셀에서 소리 내기(재생) _ sound play file [1] [레벨:30]아별 2010-12-13 7389
53 기타 헷갈리기 쉬운 워크시트 함수와 VBA함수 비교표 imagefile [레벨:30]아별 2010-10-05 6636
52 기타 기본 제공 대화 상자 실행하면 초기 값 설정 imagefile [레벨:30]아별 2010-08-25 6327
51 기타 [펌] 엑셀 VBA 총정리 _ Excel 개체 모델 참조 등 image [2] [레벨:30]아별 2010-03-09 15919
50 기타 [링크] VBA로 파일을 다루는 방법에 대한 강좌들을 모아놓은 겁니다. [레벨:30]아별 2010-03-03 9830
49 현재 엑셀 파일의 색상표(Color Chart) 확인용 코드 [레벨:30]아별 2009-12-24 7170
48 [펌] Visual Basic (비쥬얼 베이직) 함수 정리 imagefile [레벨:30]아별 2009-11-27 20068
47 엑셀 사용자 정의 수식(UDF)에 도움말 넣는 방법. [레벨:30]아별 2009-11-11 5778
46 Excel에서 메뉴 및 메뉴 모음을 사용자 지정하는 방법 image [레벨:30]아별 2009-11-04 7328