首先需要安装ImageMagick
软件windows版下载链接,不同系统版本请参考此处。
使用示例:
将convert_heic_to_jpg.py
下载后复制到HEIC
文件所在的文件夹,空白处右键在终端中打开
,执行以下cmd
命令:
python .\convert_heic_to_jpg.py --input_dir . --output_dir . --quality 90 --remove_src True --max_workers 8
–input_dir :.
当前目录,可替换为HEIC所在文件夹
–output_dir :.
当前目录,可替换为转换后文件存储文件夹
–quality :90 设置转后质量90%
–remove_src :True 删除HEIC原文件,False 保留原文件
–max_workers :8 线程数量,使用者可根据设备资源自行修改
源码如下:
import argparse
import os
import subprocess
import concurrent.futures
def convert_heif_dir_to_jpeg(input_dir=".", output_dir=".", quality=90, remove_src=False):
"""
批量转换HEIF文件到JPEG。
:param input_dir: 包含HEIF文件的目录。
:param output_dir: 存储转换后的JPEG文件的目录。
:param quality: JPEG图像的质量(1-100)。
"""
# 确保输出目录存在
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 遍历输入目录中的所有HEIF文件
for filename in os.listdir(input_dir):
if filename.lower().endswith(('.heic', '.heif')):
# 构造输入和输出文件的完整路径
input_path = os.path.join(input_dir, filename)
base_name, _ = os.path.splitext(filename) # 去除扩展名
output_path = os.path.join(output_dir, base_name + '.jpg')
# 获取绝对路径
# abs_input_path = os.path.abspath(input_path)
# abs_output_path = os.path.abspath(output_path)
# print(abs_output_path)
# ImageMagick 转换命令
command = ['magick', 'convert', abs_input_path, '-quality', str(quality), abs_output_path]
# 执行命令
try:
subprocess.run(command, check=True)
print("文件转换成功!")
# 检查文件是否存在并尝试删除
if os.path.exists(abs_input_path) and remove_src is True:
os.system(f'del {abs_input_path}')
print(f"已删除原文件:{abs_input_path}")
else:
print(f"原文件不存在:{abs_input_path}")
except subprocess.CalledProcessError as e:
print(f"文件转换或删除失败:{e}")
def convert_heif_to_jpeg(input_file, output_dir=".", quality=90, remove_src=False):
"""
批量转换HEIF文件到JPEG。
:param input_file: HEIF文件。
:param output_dir: 存储转换后的JPEG文件的目录。
:param quality: JPEG图像的质量(1-100)。
"""
# 确保输出目录存在
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 遍历输入目录中的所有HEIF文件
if input_file.lower().endswith(('.heic', '.heif')):
# 构造输入和输出文件的完整路径
base_name, _ = os.path.splitext(input_file) # 去除扩展名
output_path = os.path.join(output_dir, base_name + '.jpg')
# 获取绝对路径
abs_input_path = os.path.abspath(input_file)
abs_output_path = os.path.abspath(output_path)
print(abs_output_path)
# ImageMagick 转换命令
command = ['magick', 'convert', abs_input_path, '-quality', str(quality), abs_output_path]
# 执行命令
try:
subprocess.run(command, check=True)
print("文件转换成功!")
# 检查文件是否存在并尝试删除
if os.path.exists(abs_input_path) and remove_src is True:
os.system(f'del {abs_input_path}')
print(f"已删除原文件:{abs_input_path}")
else:
print(f"原文件不存在:{abs_input_path}")
except subprocess.CalledProcessError as e:
print(f"文件转换或删除失败:{e}")
def main():
# 创建命令行参数解析器
parser = argparse.ArgumentParser(description='Batch convert HEIF to JPEG using ImageMagick.')
parser.add_argument('--input_dir', type=str, default='.', help='Directory containing HEIF files, default is current directory.')
parser.add_argument('--output_dir', type=str, default='.', help='Directory to store converted JPEG files, default is current directory.')
parser.add_argument('--quality', type=int, default=90, help='JPEG quality (1-100), default is 90.')
parser.add_argument('--remove_src', type=bool, default=False, help='Remove *.HEIC source files after conversion, default is False.')
parser.add_argument('--max_workers', type=int, default=8, help='Max workers threads, default is 8.')
# 解析命令行参数
args = parser.parse_args()
# 获取输入目录下的所有HEIF文件
heif_files = [os.path.join(args.input_dir, f) for f in os.listdir(args.input_dir) if f.lower().endswith('.heif') or f.lower().endswith('.heic')]
# 使用ThreadPoolExecutor来处理转换
with concurrent.futures.ThreadPoolExecutor(max_workers=args.max_workers) as executor: # 设置最大工作线程数
futures = []
for file in heif_files:
future = executor.submit(convert_heif_to_jpeg, file, args.output_dir, args.quality, args.remove_src)
futures.append(future)
# 等待所有转换完成
concurrent.futures.wait(futures)
# 检查每个 Future 对象的状态
for future in futures:
if future.done():
print(f"Future {future} is done")
try:
result = future.result() # 如果函数有返回值,这里可以获取它
except Exception as e:
print(f"Generated an exception: {e}")
else:
print(f"Future {future} is not done")
if __name__ == '__main__':
main()