教你用 Python 快速批量轉(zhuǎn)換 HEIC 文件
點(diǎn)擊上方 “AirPython”,選擇 “加為星標(biāo)”
第一時(shí)間關(guān)注 Python 原創(chuàng)干貨!

1. 前言
大家好,我是安果!
最近打算做一批日歷給親朋好友,但是從 iPhone 上導(dǎo)出的照片格式是 HEIC 格式,而商家的在線制作網(wǎng)站不支持這種圖片格式
PS:HEIC 是蘋果采用的新的默認(rèn)圖片格式,它能在不損失圖片畫質(zhì)的情況下,減少圖片大小
有很多在線網(wǎng)站支持圖片批量轉(zhuǎn)換,但是安全隱私又沒法得到保證;如果使用 PS 等軟件去一張張轉(zhuǎn)換,浪費(fèi)時(shí)間的同時(shí)效率太低
本篇文章將使用 Python 批量實(shí)現(xiàn) HEIC 圖片文件的格式轉(zhuǎn)換
2. 準(zhǔn)備
首先,我們安裝?pyheif 依賴包
Linux 和 Mac OS?可以通過下面鏈接選擇合適的方式進(jìn)行安裝
https://pypi.org/project/pyheif/
如果是 Windows,我們只能下載 whl?依賴文件,使用 pip 命令進(jìn)行安裝
下載地址:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyheif
注意:我們需要根據(jù)系統(tǒng)及 Python 版本選擇對應(yīng)的文件進(jìn)行安裝
#?比如,本機(jī)是win10+64位?+?Python3.7
#?通過下面鏈接下載文件:pyheif?0.6.1?cp37?cp37m?win_amd64.whl
https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyheif
#?然后進(jìn)行虛擬環(huán)境
#?使用pip3命令安裝whl文件
pip3?install?pyheif?0.6.1?cp37?cp37m?win_amd64.whl然后,安裝 PIL 依賴,用于圖片處理
#?安裝依賴
pip3?install?Pillow
3.?實(shí)戰(zhàn)
首先,遍歷源文件夾及子文件夾,獲取所有 HEIC?格式(不區(qū)分大小寫)的圖片
import?pathlib
import?os
def?get_all_heic_imgs():
????"""
????獲取所有heic格式的圖片
????:return:
????"""
????#?heif_image_paths?=?glob.glob(r"{}/*.heic".format(source_path))
????#?滿足條件的文件列表
????filelist?=?[]
????for?root,?dirnames,?filenames?in?os.walk(source_path):
????????for?filename?in?filenames:
????????????# filename:文件名、root:文件對應(yīng)的目錄
????????????#?獲取文件后綴名
????????????file_end?=?pathlib.Path(filename).suffix
????????????#?文件名(不帶后綴)
????????????file_name?=?pathlib.Path(filename).name.split(".")[-2]
????????????if?file_end?in?['.heic',?'.HEIC']:
????????????????#?文件的完整目錄
????????????????#?file_path?=?os.path.join(root,?filename)
????????????????filelist.append({
????????????????????"filename":?file_name,
????????????????????"filepath":?os.path.join(root,?filename)
????????????????})
????return?filelist
然后,遍歷文件列表,使用?pyheif 讀取文件,使用PIL 轉(zhuǎn)為二進(jìn)制圖片,以 JPG 格式保存到目標(biāo)文件夾下
import?pyheif
from?PIL?import?Image
#?讀取文件
img?=?pyheif.read(filepath)
img_bytes?=?Image.frombytes(mode=img.mode,?size=img.size,?data=img.data)
#?文件保存完整目錄
target_file_path?=?'{}/{}_{}.jpg'.format(target_path,?filename,?generate_random_num(6))
#?保存
img_bytes.save(target_file_path,?format="jpeg")
由于圖片數(shù)目很多,圖片讀取、圖片保存都是耗時(shí)的 IO 操作,最后對程序進(jìn)行改造,利用多線程加快圖片轉(zhuǎn)換
另外,圖片可能會(huì)存在文件名重名,最后保存的文件名追加了一個(gè)隨機(jī)的字符串
import?threading
def?generate_random_num(count):
????"""
????產(chǎn)生一段隨機(jī)的字符串
????:param?count:
????:return:
????"""
????return?''.join(random.sample('abcdefghijklmnopqrstuvwxyz',?count))
????
def?convert_heic_to_jpg(file,?semaphore):
????"""
????heic格式轉(zhuǎn)jpg
????:param?files:
????:return:
????"""
????semaphore.acquire()
????
????...
????#文件操作
????#?釋放
????semaphore.release()
????
if?__name__?==?'__main__':
????...
????#?定義信號(hào)量,并發(fā)處理文件IO
????semaphore?=?threading.BoundedSemaphore(20)
????for?file?in?files:
????????t?=?threading.Thread(target=convert_heic_to_jpg,?args=(file,?semaphore))
????????t.start()
4. 最后
通過上面的操作就可以快速將 HEIC 文件批量轉(zhuǎn)換為 JPG 文件,當(dāng)然如果想轉(zhuǎn)為其他圖片,比如:PNG,只需要更改 PIL 保存圖片的格式即可
我已將文中所有源碼上傳到后臺(tái),回復(fù)關(guān)鍵字「 heic」即可以獲取
如果你覺得文章還不錯(cuò),請大家?點(diǎn)贊、分享、留言?下,因?yàn)檫@將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強(qiáng)動(dòng)力!
END

