图片的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)

参考:How to modify EXIF data in python - Stack Overflow

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐