from pillow_heif import register_heif_opener
from PIL import Image
import os
import exifread
import piexif
import time
# 批量转化图片至指定格式、复制写入拍摄信息、以拍摄时间重命名、无拍摄时间则以文件创建时间命名
def batchConvertImage(inputFolder, outputFolder, outputFormat):
# outputFormat: jpeg、png、tiff、raw、dng、bmp
# 记录图片文件名,防止重名
fileNames = []
for fileName in os.listdir(inputFolder):
# 获取文件夹内单张图片路径
inputFile = os.path.join(inputFolder, fileName)
# 读取图片
img = Image.open(inputFile)
# 命名格式
format = '%Y.%m.%d-%H%M%S'
try:
# 获取exif信息
exifDict = piexif.load(img.info['exif'])
exifBytes = piexif.dump(exifDict)
# 获取拍摄时间
shootTime = str(exifDict['Exif'][piexif.ExifIFD.DateTimeOriginal], 'utf-8')
# 格式化时间
t = time.strptime(shootTime, '%Y:%m:%d %H:%M:%S')
t = time.strftime(format, t)
# 无exif信息则获取图片修改时间
except Exception:
# 获取文件信息
fileStat = os.stat(inputFile)
# 获取文件修改时间
modificationTime = fileStat.st_mtime
# 格式化时间
t = time.localtime(modificationTime)
t = time.strftime(format, t)
exifBytes = None
# 输出图片路径
while t in fileNames:
if len(t) > len(format) + 2:
t = t[:len(format)+2] + '.' + str(int(t[len(format)+3:])+1)
else:
t = t[:len(format)+2] + '.1'
fileNames.append(t)
# 图片转化至指定格式
outputFile = os.path.join(outputFolder, f"{t}.{outputFormat if outputFormat!='jpeg' else 'jpg'}")
# 若无exif信息
if exifBytes is None:
try:
img.save(outputFile, format=outputFormat)
except OSError:
# RGBA转RGB
img = img.convert('RGB')
img.save(outputFile, format=outputFormat)
# 若有exif信息
else:
try:
# 将exif信息写入图片
img.save(outputFile, format=outputFormat, exif=exifBytes)
except OSError:
img = img.convert('RGB')
img.save(outputFile, format=outputFormat, exif=exifBytes)
# heic需要
register_heif_opener()
inputfolderPath = 'D:\\user\\desktop\\process\\fig'
outputfolderPath = 'D:\\user\\desktop\\process\\out'
outputFormat = "jpeg"
batchConvertImage(inputfolderPath, outputfolderPath, outputFormat)
处理前处理后