当前位置:   article > 正文

HEIC图片转JPG_python heic 转 jpg

python 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
  • 1

–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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
'
运行
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/902164
推荐阅读
相关标签
  

闽ICP备14008679号