赞
踩
首先需要安装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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。