最近沉迷将图片转移到谷歌照片上,但是遇到有些古老图片存在QQ空间,下载之后的图片没有日期信息,上传谷歌会直接显示日期是今日,所以比较苦恼……

于是寻找方法,修改图片的日期属性。
首先要知道EXIF这个东西,有条件可以看维基百科
因此,我们终于知道了前进的方向。


具体实现

下面来说具体实现方法。本来想着用Python、java各做一遍,哪知道Python的运行速度超级快,究其原因是经过QQ空间上传过的图片下载下来已经超级小了所以处理比较快。

环境说明

Ubuntu 18.04
Python3.*

下载依赖包

使用piexif包

pip3 install piexif

代码实现与说明

from PIL import Image
import piexif
import os


def address():
	"""
	遍历目标文件夹所有文件名
	"""
    list = os.listdir(inPwd)
    return list


def getInfo():
	"""
	获取一个图片将其Exif信息输出
	函数内的imgPwd为一种图片的绝对路径,因为测试,若要使用,需查看上下逻辑,重写
	"""
    exif_dict = piexif.load(imgPwd)
    for ifd in ("Exif", ):
        for tag in exif_dict[ifd]:
            print(piexif.TAGS[ifd][tag]["name"], exif_dict[ifd][tag])


def changeDate(imgName):
	"""
	修改一张图片的Exif值,前提是能够获取这个值
	"""
    imagePwd = inPwd + imgName
    im = Image.open(imagePwd)
    exif_dict = piexif.load(im.info["exif"])
    exif_dict = {}
    exif_dict["Exif"][piexif.ExifIFD.DateTime] = takeTime
    exif_dict["Exif"][piexif.ExifIFD.DateTimeOriginal] = takeTime
    exif_dict["Exif"][piexif.ExifIFD.DateTimeDigitized] = takeTime
    exif_bytes = piexif.dump(exif_dict)
    piexif.insert(exif_bytes, imagePwd)


def setDate(imgName):
	"""
	对于一张信息为空的图片,填充Exif数据
	"""
    imagePwd = inPwd + imgName
    exif_ifd = {
        piexif.ExifIFD.DateTimeOriginal: imgTime,
        piexif.ExifIFD.DateTimeDigitized: imgTime,
    }
    exif_dict = {"Exif": exif_ifd}
    exif_bytes = piexif.dump(exif_dict)
    im = Image.open(imagePwd)
    im.save(outPwd + imgName, exif=exif_bytes)


if __name__ == '__main__':
	"""
	inPwd 图片所在文件夹
	outPwd 图片输出文件夹
	imgTime 修改的图片时间
	imgName 图片名称
	imagePwd 图片绝对路径
	"""
    inPwd = "/home/ss/Pictures/ds/"
    outPwd = "/home/ss/Pictures/da/"
    imgTime = "2013:12:19 10:10:10"
    list = address()
    for x in list:
        setDate(x)

后续逼话

一开始打算使用** changeDate **,发现这个方法只适用于原图片有相关数据的情况下修改,而不是用于没有相关属性的情况下修改,因此有了** setDate**