图片的exif文件格式中保存了很多信息,比如GPS经纬度,高度,焦距等信息。
在图片的属性中可以看到这些信息:
我们可以使用python来进行exif数据的读取和保存。
1. 首先安装piexif
pip3 install piexif
2.exif数据读取代码
import piexif
from PIL import Image
# Read Image
fname = './1.JPG'
img = Image.open(fname)
exif_dict = piexif.load(img.info['exif'])
# Read exif data
longitude = exif_dict['GPS'][piexif.GPSIFD.GPSLongitude]
latitude = exif_dict['GPS'][piexif.GPSIFD.GPSLatitude]
altitude = exif_dict['GPS'][piexif.GPSIFD.GPSAltitude]
focal_length = exif_dict['Exif'][piexif.ExifIFD.FocalLength]
print('longitude:', longitude)
print('latitude:', latitude)
print('altitude:', altitude)
print('focal length:', focal_length)
数据输出如下:
longitude: ((117, 1), (17, 1), (532029, 10000))
latitude: ((31, 1), (43, 1), (299847, 10000))
altitude: (44783, 1000)
focal length: (880, 100)
说明:exif数据用的是分数格式和度分秒格式。
比如 ((117, 1), (17, 1), (532029, 10000))的含义是117/1度17/1分532029/10000秒,即117°17′53.2029″。
(44783, 1000)的含义是44783/1000,即44.783。
3.exif数据修改与保存代码
# Modify exif data
exif_dict['GPS'][piexif.GPSIFD.GPSLongitude] = ((180, 1), (17, 1), (532029, 10000))
# Save image with modified exif data
exif_bytes = piexif.dump(exif_dict)
img.save('1_copy.JPG', exif=exif_bytes)
我在项目中遇到的一个需求:
无人机航拍图像分辨率太大,需要对图像进行缩放,同时保留GPS数据(因为后续算法需要GPS数据)。
如果用opencv来resize图片再imwrite的话,会丢失GPS信息,不可行。可用如下的代码:
import piexif
from PIL import Image
# Read Image
fname = './DJI_0001.JPG'
img = Image.open(fname)
exif_dict = piexif.load(img.info['exif'])
# Resize image
resize_img = img.resize((1920, 1080), Image.ANTIALIAS)
# Save resized image with original exif data
exif_bytes = piexif.dump(exif_dict)
resize_img.save('1_copy.JPG', exif=exif_bytes)