使用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
,从新安装了一份。
网友评论