파이썬에서 이미지의 exif 데이터를 읽으려면 어떻게 해야 합니까?
PIL을 사용하고 있습니다.사진의 EXIF 데이터를 사전으로 변환하려면 어떻게 해야 합니까?
사용할 수 있습니다._getexif()
PIL 이미지의 보호된 방법입니다.
import PIL.Image
img = PIL.Image.open('img.jpg')
exif_data = img._getexif()
이렇게 하면 EXIF 숫자 태그로 색인화된 사전이 제공됩니다.사전을 실제 EXIF 태그 이름 문자열로 인덱싱하려면 다음과 같은 방법을 사용하십시오.
import PIL.ExifTags
exif = {
PIL.ExifTags.TAGS[k]: v
for k, v in img._getexif().items()
if k in PIL.ExifTags.TAGS
}
Python 3.x 및 시작의 경우Pillow==6.0.0
,Image
객체는 이제 "공개"/공식을 제공합니다.getexif()
반환하는 메서드<class 'PIL.Image.Exif'>
인스턴스 또는None
이미지에 EXIF 데이터가 없는 경우.
getexif()
추가되었습니다. 이는 다음을 반환합니다.Exif
사례.값은 사전처럼 검색 및 설정할 수 있습니다.JPEG, PNG 또는 WEBP를 저장할 때 인스턴스를 다음과 같이 전달할 수 있습니다.exif
출력 이미지의 변경 사항을 포함하는 인수입니다.
위에서 설명한 바와 같이 키-값 쌍을 사용하여Exif
예를 들어 일반 사전과 같습니다.키는 모듈을 사용하여 문자열 이름에 매핑할 수 있는 16비트 정수입니다.
from PIL import Image, ExifTags
img = Image.open("sample.jpg")
img_exif = img.getexif()
print(type(img_exif))
# <class 'PIL.Image.Exif'>
if img_exif is None:
print('Sorry, image has no exif data.')
else:
for key, val in img_exif.items():
if key in ExifTags.TAGS:
print(f'{ExifTags.TAGS[key]}:{val}')
# ExifVersion:b'0230'
# ...
# FocalLength:(2300, 100)
# ColorSpace:1
# ...
# Model:'X-T2'
# Make:'FUJIFILM'
# LensSpecification:(18.0, 55.0, 2.8, 4.0)
# ...
# DateTime:'2019:12:01 21:30:07'
# ...
Python 3.8.8과 함께 테스트됨Pillow==8.1.0
.
ExifRead 모듈도 사용할 수 있습니다.
import exifread
# Open image file for reading (binary mode)
f = open(path_name, 'rb')
# Return Exif tags
tags = exifread.process_file(f)
사용자:
import os,sys
from PIL import Image
from PIL.ExifTags import TAGS
for (k,v) in Image.open(sys.argv[1])._getexif().items():
print('%s = %s' % (TAGS.get(k), v))
또는 특정 필드를 가져옵니다.
def get_field (exif,field) :
for (k,v) in exif.items():
if TAGS.get(k) == field:
return v
exif = image._getexif()
print get_field(exif,'ExposureTime')
import sys
import PIL
import PIL.Image as PILimage
from PIL import ImageDraw, ImageFont, ImageEnhance
from PIL.ExifTags import TAGS, GPSTAGS
class Worker(object):
def __init__(self, img):
self.img = img
self.exif_data = self.get_exif_data()
self.lat = self.get_lat()
self.lon = self.get_lon()
self.date =self.get_date_time()
super(Worker, self).__init__()
@staticmethod
def get_if_exist(data, key):
if key in data:
return data[key]
return None
@staticmethod
def convert_to_degress(value):
"""Helper function to convert the GPS coordinates
stored in the EXIF to degress in float format"""
d0 = value[0][0]
d1 = value[0][1]
d = float(d0) / float(d1)
m0 = value[1][0]
m1 = value[1][1]
m = float(m0) / float(m1)
s0 = value[2][0]
s1 = value[2][1]
s = float(s0) / float(s1)
return d + (m / 60.0) + (s / 3600.0)
def get_exif_data(self):
"""Returns a dictionary from the exif data of an PIL Image item. Also
converts the GPS Tags"""
exif_data = {}
info = self.img._getexif()
if info:
for tag, value in info.items():
decoded = TAGS.get(tag, tag)
if decoded == "GPSInfo":
gps_data = {}
for t in value:
sub_decoded = GPSTAGS.get(t, t)
gps_data[sub_decoded] = value[t]
exif_data[decoded] = gps_data
else:
exif_data[decoded] = value
return exif_data
def get_lat(self):
"""Returns the latitude and longitude, if available, from the
provided exif_data (obtained through get_exif_data above)"""
# print(exif_data)
if 'GPSInfo' in self.exif_data:
gps_info = self.exif_data["GPSInfo"]
gps_latitude = self.get_if_exist(gps_info, "GPSLatitude")
gps_latitude_ref = self.get_if_exist(gps_info, 'GPSLatitudeRef')
if gps_latitude and gps_latitude_ref:
lat = self.convert_to_degress(gps_latitude)
if gps_latitude_ref != "N":
lat = 0 - lat
lat = str(f"{lat:.{5}f}")
return lat
else:
return None
def get_lon(self):
"""Returns the latitude and longitude, if available, from the
provided exif_data (obtained through get_exif_data above)"""
# print(exif_data)
if 'GPSInfo' in self.exif_data:
gps_info = self.exif_data["GPSInfo"]
gps_longitude = self.get_if_exist(gps_info, 'GPSLongitude')
gps_longitude_ref = self.get_if_exist(gps_info, 'GPSLongitudeRef')
if gps_longitude and gps_longitude_ref:
lon = self.convert_to_degress(gps_longitude)
if gps_longitude_ref != "E":
lon = 0 - lon
lon = str(f"{lon:.{5}f}")
return lon
else:
return None
def get_date_time(self):
if 'DateTime' in self.exif_data:
date_and_time = self.exif_data['DateTime']
return date_and_time
if __name__ == '__main__':
try:
img = PILimage.open(sys.argv[1])
image = Worker(img)
lat = image.lat
lon = image.lon
date = image.date
print(date, lat, lon)
except Exception as e:
print(e)
다음을 사용하여 확인했습니다.._getexif
상위 python 버전에서는 작동하지 않으며, 더욱이 보호 클래스이므로 가능하면 사용을 피해야 합니다.디버거를 탐색한 결과 이미지에 대한 EXIF 데이터를 가져오는 가장 좋은 방법은 다음과 같습니다.
from PIL import Image
def get_exif(path):
return Image.open(path).info['parsed_exif']
이미지의 모든 EXIF 데이터 사전을 반환합니다.
참고: Python 3.x의 경우 PIL 대신 Pill을 사용합니다.
여기 좀 더 읽기 쉬운 것이 있습니다.이것이 도움이 되기를 바랍니다.
from PIL import Image
from PIL import ExifTags
exifData = {}
img = Image.open(picture.jpg)
exifDataRaw = img._getexif()
for tag, value in exifDataRaw.items():
decodedTag = ExifTags.TAGS.get(tag, tag)
exifData[decodedTag] = value
2023년 2월 베개 정보
PIL 버전 8.2.0 API가 약간 변경되어 대부분의 태그가 의 메서드에 조금 더 깊이 숨겨졌습니다. 다른 모든 응답은 약간 구식이 되어 태그가 거의 표시되지 않았습니다(약 14개).
현대적인 방법:
from PIL import Image
from PIL.ExifTags import TAGS, GPSTAGS, IFD
from pillow_heif import register_heif_opener # HEIF support
register_heif_opener() # HEIF support
def print_exif(fname: str):
img = Image.open(fname)
exif = img.getexif()
print('>>>>>>>>>>>>>>>>>>', 'Base tags', '<<<<<<<<<<<<<<<<<<<<')
for k, v in exif.items():
tag = TAGS.get(k, k)
print(tag, v)
for ifd_id in IFD:
print('>>>>>>>>>', ifd_id.name, '<<<<<<<<<<')
try:
ifd = exif.get_ifd(ifd_id)
if ifd_id == IFD.GPSInfo:
resolve = GPSTAGS
else:
resolve = TAGS
for k, v in ifd.items():
tag = resolve.get(k, k)
print(tag, v)
except KeyError:
pass
의 루트 수준에서는 일부 유용한 태그만 사용할 수 있습니다.Exif
now(예: 제조업체, 모델, 날짜 시간, 방향, 소프트웨어).셔터 속도 값, 조리개 값, ISOS 속도 등급, WhiteBalance, DateTimeOriginal, DateTimeDiginated, ExposureBiasValue, FocusLength, ExifImageWidth, ExifIfImage와 같은 다른 유용한 태그에 액세스하려면 다음과 같이 하십시오.신장 등은 IFD라는 진단을 받아야 합니다.Exif
는 IFD GPS 정보경 IFD를니사를 합니다.GPSInfo
또한 GPS 태그에는 태그 간 인코딩 사전이 하나 더 있습니다.
이 두 줄
from pillow_heif import register_heif_opener
register_heif_opener()
최신 Apple 장치에서 기본적으로 구성된 HEIF 형식(.HEIC 파일 확장자)을 지원하려는 경우에만 필요합니다.HEIF로 작업할 필요가 없다면 생략할 수 있습니다. 코드는 PIL에서 지원하는 나머지 이미지 형식에 대해 작동합니다.
패키지 참조:
이미지 URL을 읽고 태그를 가져오려면 다음과 같이 하십시오.
from PIL import Image
from urllib.request import urlopen
from PIL.ExifTags import TAGS
def get_exif(filename):
image = Image.open(filename)
image.verify()
return image._getexif()
def get_labeled_exif(exif):
labeled = {}
for (key, val) in exif.items():
labeled[TAGS.get(key)] = val
return labeled
my_image= urlopen(url)
exif = get_exif(my_image)
labeled = get_labeled_exif(exif)
print(labeled)
그리고 GPS 좌표를 얻기 위해 제이슨 드랜시는 훌륭한 블로그 게시물을 가지고 있습니다.
나는 보통 pyexiv2를 사용하여 JPG 파일에 exif 정보를 설정하지만 스크립트 QGIS 스크립트에서 라이브러리를 가져올 때 충돌합니다.
라이브러리 exif를 사용하여 솔루션을 찾았습니다.
https://pypi.org/project/exif/
사용하기 쉽고, Qgis를 사용하면 문제가 없습니다.
이 코드에서 GPS 좌표를 화면 스냅샷에 삽입합니다.
from exif import Image
with open(file_name, 'rb') as image_file:
my_image = Image(image_file)
my_image.make = "Python"
my_image.gps_latitude_ref=exif_lat_ref
my_image.gps_latitude=exif_lat
my_image.gps_longitude_ref= exif_lon_ref
my_image.gps_longitude= exif_lon
with open(file_name, 'wb') as new_image_file:
new_image_file.write(my_image.get_file())
언급URL : https://stackoverflow.com/questions/4764932/in-python-how-do-i-read-the-exif-data-for-an-image
'programing' 카테고리의 다른 글
Pandas/NumPy에서 열/변수가 숫자인지 여부를 확인하는 방법은 무엇입니까? (0) | 2023.07.16 |
---|---|
그래프QL 큰 정수 오류:Int는 32비트 부호가 없는 정수 값을 나타낼 수 없습니다. (0) | 2023.07.16 |
Spring Boot이 application.yml config를 로드하지 않습니다. (0) | 2023.07.16 |
data.table에서 이름으로 열을 삭제하려면 어떻게 해야 합니까? (0) | 2023.07.16 |
판다 데이터 프레임에서 범주형 데이터 변환 (0) | 2023.07.16 |