美文网首页
Python HEIC转JPG

Python HEIC转JPG

作者: 平原河流 | 来源:发表于2020-04-23 16:01 被阅读0次

    使用iPhone拍照后,图片格式为HEIC。
    一张图片都有1M多,尺寸还是3024x4032,这个有点大啊!(注:公司的测试手机是iPhone XS、iOS 12.0.1)

    最近学习TensorFlow时,用到Pascal VOC格式的数据集,看到一般图片格式都是JPG的,而且还比较小。就想着怎么用Python转换一下格式。这算项目需求背景吧(扶额...)

    直接上代码

    # -*- coding: utf-8 -*-
    from PIL import Image
    import pyheif
    import os
    import whatimage
    import traceback
    
    
    # 循环读取HEIC格式照片,写入JPG
    def recyle_convert(org_path, dst_path):
        # 判断是不是目录
        if os.path.isdir(org_path):
            file_list = os.listdir(org_path)
            for idx, file in enumerate(file_list):
                sub_path = os.path.join(org_path, file)
                recyle_convert(sub_path, dst_path)
        # 判断是不是文件
        elif os.path.isfile(org_path):
            with open(org_path, 'rb') as f:
                file_data = f.read()
                try:
                    # 判断照片格式
                    fmt = whatimage.identify_image(file_data)
                    if fmt in ['heic']:
                        # 读取图片
                        heif_file = pyheif.read_heif(org_path)
                        image = Image.frombytes(mode=heif_file.mode, size=heif_file.size, data=heif_file.data)
                        # 将要存储的路径及名称
                        path, filename = os.path.split(org_path)
                        name, ext = os.path.splitext(filename)
                        file_path = os.path.join(dst_path, '%s.jpg' % name)
                        print(file_path)
                        # 缩略图(原始图片太大了,换成1080x1440)
                        image.thumbnail((1080, 1440))
                        # 保存图片(JPEG格式)
                        image.save(file_path, "JPEG")
                except:
                    traceback.print_exc()
        else:
            print(org_path + 'is error format!')
        pass
    
    
    # 主函数入口
    def main():
        # dst path
        dst_path = '/Users/ll/Desktop/105APPLE'
        if os.path.exists(dst_path) is False:
            os.makedirs(dst_path)
            pass
        # org path
        org_path = '/Users/ll/Desktop/104APPLE'
        # convert
        recyle_convert(org_path, dst_path)
        pass
    
    
    if __name__ == '__main__':
        main()
        pass
    

    代码整体思路是从一个目录(也可以是单个照片文件),读取HEIC照片文件,然后转成JPG。考虑到一个目录下,可能有多个HEIC照片文件,就用了递归调用。

    其中代码引入了pyheif,这个库安装时也遇到一些坑。
    安装示例代码:

    pip install -U pyheif
    

    安装过程中,会依赖其他库(其他库有会依赖Command Line Tools),而最新的Mac系统,安装Xcode后,Command Line Tools目录不在/usr目录下,导致安装不成功。
    最后的解决办法是从苹果开发者官网手动下载Command Line Tools,从新安装了一份。

    相关文章

      网友评论

          本文标题:Python HEIC转JPG

          本文链接:https://www.haomeiwen.com/subject/qqhaihtx.html