본문 바로가기
IT, Software/Python

Python PIL활용 exif 사진 촬영날짜 확인하기

by 기타마을이장 2020. 11. 25.

얼마 전 만들기 시작한 Python 활용 윈도우 프로그램을 좀 더 확장하려고 아이템을 찾다보니,

아가들 사진들이 무수히 쌓이지만 촬영장비별로 파일명이 제각각이어서 정리가 어려웠던 기억이 떠올랐다.

아이폰, 갤럭시, DSLR 카메라 각각이 다 저장하는 파일명이 다르다 보니 어렵다;;;;

그래서 툴을 한번 만들어보기로 했다.

Python PIL 설치

Python을 활용해서 이미지 exif를 확인하는 방법은 매우 다양했다.

그리고 그 다양한 방법들 중 Python에서 제공하는 라이브러리를 쓰는 게 가장 안정적일 거 같다는 생각이 들어

PIL(Python Image Library) 라이브러리를 활용해보기로 했다.

샘플 코드를 활용해서 코드를 작성하는데...

 

역시 기본 파이선만 설치해둔 상태라 PIL import 하는 부분에서 에러가 발생한다.

Pycharm에서는 설치 안된 패키지의 경우 오류 표시 부분 위를 마우스로 클릭하면 대부분 자동 설치를 진행하다.

그래서 이번에도 이 방법으로 해봤다. 그런데;;;; PIL이라는 패키지는 없다는 설치 에러가 발생한다.

 

찾아보니 PIL이라는 이름으로 설치는 안되고 image 패키지를 설치해야 한다고 한다.

그래서 별도 cmd 입력으로 설치를 완료하고 오류를 해소할 수 있었다.

설치를 진행하면 image 패키지뿐 아니라 연관된 pillow 패키지도 함께 설치된다.

pip install image

Python PIL로 exif 정보 추출하기

설치된 PIL 패키지를 활용하면 exif 정보 추출이 너무 편하다.

그리고 이번에 하려는 기능이 사진별 촬영 시간으로 파일명을 일괄 변경하는 것이기에 아래 3개 중 하나를 선택해서 필요한 시간을 사용하면 된다.

'DateTimeOriginal', 'DateTimeDigitized', 'DateTime'

'DateTimeOriginal', 'DateTimeDigitized'는 실제로 사진을 찍은 시간이고,

'DateTime'은 사진을 편집한 시간이 저장되어 있는 것 같다.

그래서 난 'DateTimeOriginal' 정보를 기본으로 사용하고 혹시 정보가 없으면 'DateTime'을 사용하기로 했다.

def get_exif_timestamp(src) :
    ret = {}
    exifTimestamp = ''
    i = Image.open(src)
    try :
        info = i._getexif()
        for tag, value in info.items() :
            decoded = TAGS.get(tag, tag)
            ret[decoded] = value

        if ret['DateTimeOriginal'] != None :
            return ret['DateTimeOriginal']

        if ret['DateTimeDigitized'] != None:
            return ret['DateTimeDigitized']

        if ret['DateTime'] != None:
            return ret['DateTime']

    except Exception as e :
        print(e)

    return exifTimestamp

 

 

Nikon D750으로 촬영한 사진에 대해서 PIL로 추출해본 exif 정보를 전부 출력해본 결과는 아래와 같다.

exif에 저장된 digit 값을 PIL 패키지 내 있는 TAGS Dictionary를 활용하여 그 의미를 알아내고, 각각의 정보를 출력했다.

적절히 활용한다면 꼭 timestamp값이 아닌 다른 것들을 활용해서 파일명 변경이 가능할 것 같다.

36864  :  ExifVersion  :  b'0230'
37121  :  ComponentsConfiguration  :  b'\x01\x02\x03\x00'
37122  :  CompressedBitsPerPixel  :  4.0
36867  :  DateTimeOriginal  :  2018:08:15 11:47:22
36868  :  DateTimeDigitized  :  2018:08:15 11:47:22
37377  :  ShutterSpeedValue  :  11.965784
37378  :  ApertureValue  :  4.0
37380  :  ExposureBiasValue  :  0.0
37381  :  MaxApertureValue  :  3.4
37383  :  MeteringMode  :  5
37384  :  LightSource  :  0
37385  :  Flash  :  16
37386  :  FocalLength  :  38.0
37510  :  UserComment  :  b'ASCII\x00\x00\x00                                    '
40961  :  ColorSpace  :  1
40962  :  ExifImageWidth  :  3804
37520  :  SubsecTime  :  31
37521  :  SubsecTimeOriginal  :  31
37522  :  SubsecTimeDigitized  :  31
40963  :  ExifImageHeight  :  2539
41996  :  SubjectDistanceRange  :  0
257  :  ImageLength  :  4016
258  :  BitsPerSample  :  (8, 8, 8)
41495  :  SensingMethod  :  2
271  :  Make  :  NIKON CORPORATION
41728  :  FileSource  :  b'\x03'
33434  :  ExposureTime  :  0.00025
40965  :  ExifInteroperabilityOffset  :  984
282  :  XResolution  :  300.0
33437  :  FNumber  :  4.0
41729  :  SceneType  :  b'\x01'
283  :  YResolution  :  300.0
34850  :  ExposureProgram  :  3
41730  :  CFAPattern  :  b'\x02\x00\x02\x00\x00\x01\x01\x02'
34853  :  GPSInfo  :  {0: b'\x02\x03\x00\x00'}
41985  :  CustomRendered  :  0
34855  :  ISOSpeedRatings  :  400
296  :  ResolutionUnit  :  2
262  :  PhotometricInterpretation  :  2
41986  :  ExposureMode  :  0
40960  :  FlashPixVersion  :  b'0100'
256  :  ImageWidth  :  6016
34864  :  34864  :  2
41987  :  WhiteBalance  :  0
305  :  Software  :  Adobe Photoshop CS6 (Windows)
306  :  DateTime  :  2018:08:24 12:49:07
41988  :  DigitalZoomRatio  :  1.0
41989  :  FocalLengthIn35mmFilm  :  38
41990  :  SceneCaptureType  :  0
41991  :  GainControl  :  1
41992  :  Contrast  :  0
41993  :  Saturation  :  0
41994  :  Sharpness  :  0
272  :  Model  :  NIKON D750
274  :  Orientation  :  1
34665  :  ExifOffset  :  308
531  :  YCbCrPositioning  :  2
277  :  SamplesPerPixel  :  3

 

반응형

댓글