Windows 上使用 Python 将 HEIC 批量转成 JPG/PNG

老王最近将 iPhone 上的手机传到电脑上,发现很多照片的格式都是 HEIC 的,一些软件不支持打开 HEIC 格式的图片,所以就搜了下如何使用 Python 将照片批量从 HEIC 转成 JPG/PNG,大部分教程是针对 Linux 或者 Mac 的,本文记录下在 Windows 上如何实现这个照片格式的转换。

一、依赖的包

网上很多教程都是依赖 pyheif 这个包来读取 HEIC 文件的,但是这个包目前只支持 Linux 和 Mac,在 Windows 上无法安装也无法使用,于是乎在 StackOverflow 找到了一个适用于 Windows 的替换包:pillow_heif,直接用 pip 安装或者在 PyCharm 中安装即可。

二、代码分享

下面直接分享代码,安装好依赖后,改个路径就可以用:

# -*- coding: utf-8 -*-
from PIL import Image
# import pyheif
import os
import pillow_heif
import whatimage


# 循环读取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 = pillow_heif.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:
                print('except')
    else:
        print(org_path + 'is error format!')
    pass


# 主函数入口
def main():
    # dst path
    dst_path = 'D:\PR\素材\jpg'
    if os.path.exists(dst_path) is False:
        os.makedirs(dst_path)
        pass
    # org path
    org_path = 'D:\PR\素材'
    # convert
    recyle_convert(org_path, dst_path)
    pass


if __name__ == '__main__':
    main()
    pass

给TA打赏
共{{data.count}}人
人已打赏
技术教程

两个文本文件不同的文本比较方法

2022-11-2 23:10:28

技术教程

Android设置状态栏颜色和状态栏文字

2022-11-3 23:40:20

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索