안녕하세요!
오늘은 비전공자도 가능한 파이썬으로 사진 위도, 경도 시간을 알아내려고 합니다.
이렇게 이름을 변경하려고 하는데요
<개발 프로세스>
1. 사진에서 정보 추출
* 위도, 경도(GPS 정보 추출) 추출
* 시간
2. 위도, 경도 -> 주소로 변환
3. 파일이름 변경
* 변경 전:KakaoTalk_2022-05-20 14-22-57.jpg
* 변경후:아산시_구령리_2022-05-20 14-22-57.jpg
로 지정했습니다.
1. 사진 정보 추출
먼저 사진 정보를 추출하려고 합니다.
from PIL import Image #파이썬 이미지 라이브러리(Python Image Library)
from PIL.ExifTags import TAGS
image = Image.open(r'./사진/KakaoTalk_2022-06-04 14-06-00.jpg')
info = image._getexif() #이미지 메타정보
info
이미지 처리를 위해서 'Pillow'라이브러리를 사용합니다.
Pillow란 파이썬 이미지 처리 라이브로 아래 코드를 사용해 설치합니다.
!pip install pillow
이후 pillow를 불러오려는데요
코드는 아래처럼 사용됩니다.
from PIL import Image
이미지 메타정보를 읽을 수 있는 (Exif)
코드도 작성합니다.
from PIL import Image #파이썬 이미지 라이브러리(Python Image Library)
from PIL.ExifTags import TAGS
이후 사용할 사진과 사진의 정보를 불러옵니다.
image = Image.open(r'./사진/KakaoTalk_2022-06-04 14-06-00.jpg')
info = image._getexif() #이미지 메타정보
info
그럼 이렇게 사진에 대한 값이 출력됩니다.
2. 파일 속성 정보 디코딩
이제 파일 속성 정보를 디코딩하려 합니다.
from PIL.ExifTags import TAGS
for tag,value in info.items():
# print(value)
decoded = TAGS.get(tag,tag) #태그숫자를 디코딩
print(tag,decoded,value)
방금보다 훨씬 낫죠?
3. GPS 정보 추출
이제 GPS 정보를 불러오려 합니다.
# GPSInfo 정보 추출
from PIL.ExifTags import TAGS
for tag,value in info.items():
# print(value)
decoded = TAGS.get(tag,tag) #태그숫자를 디코딩
# print(tag,decoded,value)
if decoded == 'GPSInfo':
print(f'{decoded}:{value}')
이런 식으로 GPSInfo가 출력됩니다.
좀 더 깨끗하게 보기 위해서
위도와 경도를 분리합니다.
# GPSInfo 정보 추출(위도, 경도)
from PIL.ExifTags import TAGS
for tag,value in info.items():
# print(value)
decoded = TAGS.get(tag,tag) #태그숫자를 디코딩
# print(tag,decoded,value)
if decoded == 'GPSInfo':
# print(f'{decoded}:{value}')
gps_lat = value.get(2) #위도
gps_lon = value.get(4) #경도
print(gps_lat,gps_lon)
마지막으로 위도와 경도 값을 보정해줍니다.
# 위도 경도 값 보정 (도,분,초) 1도는 60분이며, 1분은 60초이다. 1도 = 60분 = 3600초
lat = (((gps_lat[2] / 60.0 ) + gps_lat[1]) / 60.0) + gps_lat[0]
lon = (((gps_lon[2] / 60.0 ) + gps_lon[1]) / 60.0) + gps_lon[0]
4. 지오코드 사용
이제 위도, 경도에서 주소로 변환시키려 합니다.
이를 위해 먼저 지오코드 설치가 필요합니다.
https://pypi.org/project/geopy/
%pip install geopy
먼저 이 코드를 이용해서 설치해 준 다음,
링크의 이 부분을 이용하려고 합니다.
# 지오코드 사용법 살펴보기
# 주소를 위도 경도로 변환
from geopy.geocoders import Nominatim
# test = '구로구 디지털로 27'
test = '강남구 학동로 346'
geolocator = Nominatim(user_agent='South Korea') # user_agent는 식별가능 문자열(아무 문자열)
location = geolocator.geocode(test)
latitude = location.latitude #위도
longitude = location.longitude #경도
print(latitude,longitude )
를 하면
이 값이 추출되고
한번 더 정제하면
lat_lng_str = f'{latitude},{longitude}' #위도 경도 문자열
loc = geolocator.reverse(lat_lng_str)
loc.address
이렇게 값이 추출됩니다.
5. Datetime 활용
위도와 경도 값도 추출했으니,
이제 시간 정보를 얻으려 합니다.
날짜 정보는 datetime을 이용합니다
datetime 모듈은 날짜, 시간을 다루며 별도의 설치 과정이 필요 없습니다.
단순히 import를 하면 됩니다.
import datetime
그중에서 datetime.datetime.strptime()은
문자열로 되어 있는 날짜 또는 시간을 데이터 타임으로 변환합니다.
datetime.datetime.strftime()은
datetime 객체를 원하는 형식의 문자열로
표현할 수 있도록 돕습니다.
# 2022-06-04 14-06-00
import datetime
from PIL.ExifTags import TAGS
for tag,value in info.items():
# print(value)
decoded = TAGS.get(tag,tag) #태그숫자를 디코딩
# print(tag,decoded,value)
if decoded == 'DateTime':
# print(f'{decoded}:{value}')
print(value)
dt = datetime.datetime.strptime(value,"%Y:%m:%d %H:%M:%S")
dtime = dt.strftime("%Y-%m-%d %H-%M-%S")
print(dtime)
이 값이 추출됩니다.
6. 종합코드
from PIL import Image #파이썬 이미지 라이브러리(Python Image Library)
from PIL.ExifTags import TAGS
from geopy.geocoders import Nominatim
import datetime
from glob import glob
import os
flist = glob(r'사진\*.jpg')
for fname in flist:
lat, lon, pictime = getPicInfo(fname)
si,do = getAddress(lat,lon)
# print(lat, lon, pictime)
# print(si,do)
newfname = f'사진\\{si}_{do}_{pictime}.jpg'
# print(newfname)
os.rename(fname,newfname)
감사합니다!
'데이터 > 파이썬 활용' 카테고리의 다른 글
[영수증 분석] 비전공자도 가능한 파이썬으로 영수증 분석하기 (0) | 2023.07.23 |
---|---|
[QR코드]비전공자도 가능한 파이썬으로 3분 만에 만드는 법 (0) | 2023.07.19 |