Python 修改图片的Exif信息

问题描述:

某一文件夹下有N个子文件夹,子文件夹内的图片均为3张,且命名方式为xxxA.jpg,xxxB.jpg和xxxC.jpg(xxx为子文件夹名),要求将所有子文件夹内xxxC.jpg图片和xxxB.jpg图片的拍摄时间修改为xxxA.jpg拍摄时间的后续100~500s范围内,且每张图片的创建时间/修改时间均为自己修改后的拍摄时间,xxxC.jpg图片和xxxB.jpg的相机参数/手机参数与xxxA.jpg相同。

使用工具:python

版本:3.7.0

模块:piexif(1.1.3),Pillow(7.2.0),win32,easygui(0.98.2)

import easygui
import time
import os
import random
import piexif
from PIL import Image
from win32file import CreateFile, SetFileTime, GetFileTime, CloseHandle
from win32file import GENERIC_READ, GENERIC_WRITE, OPEN_EXISTING
from pywintypes import Time

pic = easygui.enterbox("文件夹路径:")



def TimeStampToTime(timestamp):
    timeStruct = time.localtime(timestamp)
    return time.strftime('%d.%m.%Y %H:%M:%S',timeStruct)


def set_file_time(file, rootDir):
  # 先传修改时间,再传访问时间
  filePath = rootDir + '\\' + file.split('.jpg')[0][:-1] + '\\' + file
  filePath1 = rootDir + '\\' + file.split('.jpg')[0][:-1] + '\\' + file.split('.jpg')[0][:-1] + 'B' + '.jpg'
  filePath2 = rootDir + '\\' + file.split('.jpg')[0][:-1] + '\\' + file.split('.jpg')[0][:-1] + 'C' + '.jpg'

  im0 = Image.open(filePath)
  exif_dict0 = piexif.load(im0.info["exif"])
  im0.close()
  CameraOwnerName = ''
  LensModel = ''
  Software = ''
  # 某些照片的Scenetype不是byte类型,强制变更所有照片的Scenetype为b'\x01',防止部分报错。
  Scenetype = b'\x01'
  format = "%d.%m.%Y %H:%M:%S"
  r1 = random.randint(60, 500)
  r2 = random.randint(60, 500)

  try:
      oldtime = exif_dict0["0th"][306].decode()
      set_wai_time(filePath, oldtime)
      CameraOwnerName = exif_dict0["0th"][271]
      LensModel = exif_dict0["0th"][272]
      Software = exif_dict0["0th"][305]

      timelist = oldtime.split(' ')
      year = timelist[0].split(':')[0]
      month = timelist[0].split(':')[1]
      day = timelist[0].split(':')[2]
      hour = timelist[1].split(':')[0]
      minute = timelist[1].split(':')[1]
      second = timelist[1].split(':')[2]
      pttime = day + '.' + month + '.' + year  + ' ' + hour  + ':' + minute + ':' + second
      cTime_t = int(time.mktime(time.strptime(pttime, format)))
      newim1 = time.strftime("%Y:%m:%d  %H:%M:%S", time.localtime((cTime_t + r1)))
      newim2 = time.strftime("%Y:%m:%d  %H:%M:%S", time.localtime((cTime_t + r1 + r2)))

  except:
      pttime = TimeStampToTime(os.path.getctime(filePath))
      cTime_t = int(time.mktime(time.strptime(pttime, format)))
      newim1 = time.strftime("%Y:%m:%d  %H:%M:%S", time.localtime((cTime_t + r1)))
      newim2 = time.strftime("%Y:%m:%d  %H:%M:%S", time.localtime((cTime_t + r1 + r2)))

  changeDate(filePath1,newim1,CameraOwnerName,LensModel,Software,Scenetype)
  changeDate(filePath2, newim2,CameraOwnerName,LensModel,Software,Scenetype)
  set_wai_time(filePath1, newim1)
  set_wai_time(filePath2, newim2)

def set_wai_time(fName, pttime):
  # 先传修改时间,再传访问时间
  format ="%Y:%m:%d  %H:%M:%S"
  offset = 0  # in seconds
  # create struct_time object
  cTime_t = time.localtime(time.mktime(time.strptime(pttime, format)) + offset)
  mTime_t = time.localtime(time.mktime(time.strptime(pttime, format)) + offset)
  aTime_t = time.localtime(time.mktime(time.strptime(pttime, format)) + offset)
  # change timestamp of file
  fh = CreateFile(fName, GENERIC_READ | GENERIC_WRITE, 0, None, OPEN_EXISTING, 0, 0)
  createTime, accessTime, modifyTime = GetFileTime(fh)
  createTime = Time(time.mktime(cTime_t))
  accessTime = Time(time.mktime(aTime_t))
  modifyTime = Time(time.mktime(mTime_t))
  SetFileTime(fh, createTime, accessTime, modifyTime)
  CloseHandle(fh)
#
def changeDate(imgName,takeTime,CameraOwnerName,LensModel,Software,Scenetype):
    im = Image.open(imgName)
    exif_dict = piexif.load(im.info["exif"])
    exif_dict["0th"][306] = takeTime
    exif_dict["Exif"][piexif.ExifIFD.DateTimeOriginal] = takeTime
    exif_dict["Exif"][piexif.ExifIFD.DateTimeDigitized] = takeTime
    exif_dict["0th"][271] = CameraOwnerName
    exif_dict["0th"][272] = LensModel
    exif_dict["0th"][305] = Software
    exif_dict["Exif"][41729] = Scenetype
    try:
        exif_bytes = piexif.dump(exif_dict)
        piexif.insert(exif_bytes, imgName)
    except:
        print('failed:',imgName)



def bianLi(rootDir):
    for root, dirs, files in os.walk(rootDir):
        for file in files:
            set_file_time(file,rootDir)
            print('修改:',file)
            break

bianLi(pic)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一、安装和使用 Jhead 2.82_绿色英文版 使用时,点击开始菜单-运行命令,在对话框输入: "jhead –命令参数 jpeg文件" 例如: “jhead -de D:\My Pictures\A.jpg” 删除D盘My Pictures文件夹A.jpg文件的exif信息。 “jhead -de D:\My Pictures\*.jpg” 删除D盘My Pictures文件夹所有jpg文件的exif信息。其中星号是通配符。 二、通用指令参数 -te 将其他jpeg文件的eixf导入目标jpeg。例如"jhead –te D:\My Pictures\B.jpg D:\My Pictures\A.jpg" -dc 删除jpeg信息中的备注。注意,jpeg文件有两个备注,一是和其他文件一样的备注,另一个是exif信息中的备注。jhead仅对exif信息有效。 -de 完全删除exif信息。 -du 删除非原始exif信息,例如Photoshop、Turbophoto之类编辑后修改exif留下的信息。 -purejpg 删除所有jpeg文件非必须的信息。相当于-de、-dc和-du的集合,可以将文件减小数k。 -ce 修改文件的jpeg文件头部分备注(此备注并非exif信息)。该指令会打开文本编辑器,并在编辑器关闭时将备注信息存入文件。 -cs 导出备注。例如"jhead –cs D:\1.txt D:\My Pictures\A.jpg" -ci 导入备注。例如"jhead –ci D:\1.txt D:\My Pictures\A.jpg" -cl 直接输入备注。。例如"jhead –cl 我的备注 D:\My Pictures\A.jpg" 三、其他指令 时间日期 -ft 将jpeg文件的“修改时间”修改exif信息中记录的时间。 -n[] 该指令会将文件名修改exif信息中记录的“创建时间”;如果jpeg文件没有exif或者exif中的创建时间不可用,则将文件名修改为文件的“修改时间”。 默认的格式-顺序为MMDD-HHMMSS 格式-顺序参数如下: %d-日(01-31) %H-小时(00-23) %j-一年中的第几天(001-366) %m-月(01-12) %M-分钟(00-59) %S-秒(00-59) %U-一年中的第几周(00-53) %w-星期几(0-6,周日为0) %y-两位数纪年(00-99) %Y-四位数几年 %i-添加数字序号 例如: jhead -n%Y%m%d-%H%M%S d:\*.jpg 将所有jpg文件修改为YYYYMMDD-HHMMSS.jpg的格式。 -nf 与“-n”相同功能相同,不保留原文件名。 -a 修改不同扩展名的同名文件名,相机拍摄的avi短片exif信息存储在与其同名的thm文件中,可用此指令给avi文件更名。一般与“-n”指令共同使用。 -ta 修正时差,例如时差根据时区确定,例如+1:00或者-1:00 -da- 修正日期。日期格式是yyyy:mm:dd、yyyy:nn:dd+hh:mm或者 yyyy:mm:dd+hh:mm:ss。根据前后参数时间差调整exif的时间。 -ts 直接修改exif中的拍摄时间,日期-时间格式为yyyy:mm:dd-hh:mm:ss

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunidd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值