HEIC图片转JPG

首先需要安装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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值