আমি পিআইএল ব্যবহার করছি আমি কীভাবে EXIF ডেটা স্টাফের অভিধানে রূপান্তর করব?
আমি পিআইএল ব্যবহার করছি আমি কীভাবে EXIF ডেটা স্টাফের অভিধানে রূপান্তর করব?
উত্তর:
এটা চেষ্টা কর:
import PIL.Image
img = PIL.Image.open('img.jpg')
exif_data = img._getexif()
এটি আপনাকে এক্সআইএফ সংখ্যার ট্যাগ দ্বারা সূচকযুক্ত একটি অভিধান দেবে। আপনি যদি প্রকৃত এক্সআইএফ ট্যাগ নামের স্ট্রিং দ্বারা সূচিকৃত অভিধানটি চান তবে এর মতো কিছু চেষ্টা করুন:
import PIL.ExifTags
exif = {
PIL.ExifTags.TAGS[k]: v
for k, v in img._getexif().items()
if k in PIL.ExifTags.TAGS
}
import ExifTags
( PIL
উপসর্গ ছাড়া )
আপনি এক্সিফ্রেড মডিউলটিও ব্যবহার করতে পারেন :
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().iteritems():
print '%s = %s' % (TAGS.get(k), v)
বা একটি নির্দিষ্ট ক্ষেত্র পেতে:
def get_field (exif,field) :
for (k,v) in exif.iteritems():
if TAGS.get(k) == field:
return v
exif = image._getexif()
print get_field(exif,'ExposureTime')
name2tagnum = dict((name, num) for num, name in TAGS.iteritems())
এবং তারপরেও করতে পারেন name2tagnum['ExposureTime']
।
exif.iteritems()
করার জন্যexif.items()
পাইথন 3.x এবং শুরু করার জন্য Pillow==6.0.0
, Image
অবজেক্টগুলি এখন এমন একটি getexif()
পদ্ধতি সরবরাহ করে যা প্রত্যাবর্তন করে <class 'PIL.Image.Exif'>
বা None
যদি চিত্রটিতে কোনও এক্সআইএফ ডেটা না থাকে।
থেকে বালিশ 6.0.0 রিলিজ নোট :
getexif()
যোগ করা হয়েছে, যা একটিExif
উদাহরণ দেয় returns মানগুলি পুনরুদ্ধার করা যায় এবং অভিধানের মতো সেট করা যায়। জেপিইজি, পিএনজি বা ডাব্লুইইবিপি সংরক্ষণexif
করার সময়, আউটপুট চিত্রের যে কোনও পরিবর্তন অন্তর্ভুক্ত করার জন্য উদাহরণটি আর্গুমেন্ট হিসাবে পাস করা যেতে পারে ।
Exif
আউটপুট কেবল একটি থেকে casted যাবে dict
, যাতে এক্জিফ তথ্য তারপর একটি নিয়মিত কী-মান জোড়া হিসাবে অ্যাক্সেস করা যেতে পারে dict
। কীগুলি হ'ল 16-বিট পূর্ণসংখ্যা যা ExifTags.TAGS
মডিউলটি ব্যবহার করে তাদের স্ট্রিংয়ের নামের সাথে ম্যাপ করা যায় ।
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:
img_exif_dict = dict(img_exif)
print(img_exif_dict)
# { ... 42035: 'FUJIFILM', 42036: 'XF23mmF2 R WR', 42037: '75A14188' ... }
for key, val in img_exif_dict.items():
if key in ExifTags.TAGS:
print(f"{ExifTags.TAGS[key]}:{repr(val)}")
# ExifVersion:b'0230'
# ...
# FocalLength:(2300, 100)
# ColorSpace:1
# FocalLengthIn35mmFilm:35
# ...
# Model:'X-T2'
# Make:'FUJIFILM'
# ...
# DateTime:'2019:12:01 21:30:07'
# ...
পাইথন 3.6.8 এবং Pillow==6.0.0
।
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
উচ্চতর অজগর সংস্করণে ব্যবহার করা কাজ করে না, তদুপরি, এটি একটি সুরক্ষিত শ্রেণি এবং যদি সম্ভব হয় তবে এটি ব্যবহার করা উচিত। ডিবাগারের চারপাশে খনন করার পরে এটিই আমি একটি চিত্রের জন্য এক্সআইএফ ডেটা পাওয়ার সর্বোত্তম উপায় বলে মনে করি:
from PIL import Image
def get_exif(path):
return Image.open(path).info['parsed_exif']
এটি একটি চিত্রের সমস্ত এক্সআইএফ ডেটার একটি অভিধান প্রদান করে।
দ্রষ্টব্য: পাইথন 3.x এর জন্য পিআইএল এর পরিবর্তে বালিশ ব্যবহার করুন
info['parsed_exif']
বালিশ 6.0 বা আরও নতুন প্রয়োজন। info['exif']
5.4 এ উপলব্ধ তবে এটি একটি কাঁচা বাইস্টেরিং।
info['parsed_exif']
সংস্করণ 7.0.0 মধ্যে; শুধুমাত্র info['exif']
।
আমি সাধারণত জেপিজি ফাইলে এক্সিফ তথ্য সেট করার জন্য পাইক্সিভি 2 ব্যবহার করি তবে আমি যখন কোনও স্ক্রিপ্ট QGIS স্ক্রিপ্ট ক্র্যাশে লাইব্রেরিটি আমদানি করি।
আমি লাইব্রেরি এক্সিফ ব্যবহার করে একটি সমাধান পেয়েছি:
https://pypi.org/project/exif/
এটি ব্যবহার করা এত সহজ, এবং কিউগিসের সাথে আমি ডোন করি না, কোনও সমস্যা নেই।
এই কোডটিতে আমি জিপিএসের স্থানাঙ্কগুলি স্ক্রিনের স্ন্যাপশটে sertোকান:
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())