咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

Python批量转换HEIC图片为PNG

苹果设备现在拍照的文件都是 .heic 格式,文件占的存储空间确实更小了,但导出到Windows查看,打开图片所在文件夹就被会卡到不行,为了方便整理图片,可以考虑将图片批量转为 pngjpg等格式。
网上很多网站提供在线转换,这对于大量图片来说肯定不适用,而且个人图片还存在隐私问题,所以考虑用Python来做这个事情。

一、格式详解

HEIFHEIC 的介绍请看这篇文章:【HEIF/heic图片文件解析】
简单来说,HEIF 是一个容器的图片格式,当前包含的编码 HEVC(256) 和 H.264/MPEG-4 AVC
在苹果设备采用的HEIC就是 HEIF采用 HEVC编码的一种,文件后缀为 *.heic

二、库

如果想自己去提取HEIF文件中的图片,一定会使用到诺基亚的C++库【nokiatech/heif】,我们用Python也是要用到这个库,但我们不直接安装这个库。

pyheif 这个库不能通过 pip install pyheif 来安装,提示说要C++编译环境。

可以通过下载whl文件,然后本地安装
pyheif依赖库下载
我当前的环境是 Win10 + Python3.7 ,所以下载【pyheif‑0.6.1‑cp37‑cp37m‑win_amd64.whl】

三、安装依赖

1
2
pip install pyheif‑0.6.1‑cp37‑cp37m‑win_amd64.whl
pip3 install Pillow

四、代码

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
import os
import pyheif
from PIL import Image

# 只遍历一级目录
def get_dir_heic_files(source_path):
filelist = []
fileList = os.listdir(source_path)
for file in fileList:
if(file.find('.heic') > 0):
names = file.split(".")
filelist.append({
"filename": names[0],
"filepath": os.path.join(source_path, file)
})
return filelist

def heic2Png(src_path,target_path):
print(src_path,'->',target_path)
img_heic = pyheif.read(src_path)
img_heic_bytes = Image.frombytes(mode=img_heic.mode, size=img_heic.size, data=img_heic.data)
# img_heic_bytes.save(target_path, format="jpg")
img_heic_bytes.save(target_path, format="png")

if __name__ == '__main__':
source_dir = "D://test/"
target_dir = "D://test/png"
if not os.path.exists(target_dir):
os.makedirs(target_dir)
files = get_dir_heic_files(source_dir)
for file in files:
target_file_path = '{}/{}.png'.format(target_dir,file['filename'])
heic2Png(file['filepath'],target_file_path)