1.前言最近打算做一批亲友的挂历,但是iPhone导出的照片格式是HEIC格式,商家在线制作网站不支持这种图片格式PS:HEIC是新的Apple默认采用的图片格式,可以在不损失图片质量的情况下缩小图片尺寸。支持图片批量转换的网上网站很多,但安全和隐私得不到保障;如果用PS等软件一张一张转换,既浪费时间又效率太低。本文将使用Python批量转换HEIC图像文件二、准备工作首先,我们安装pyheif依赖包Linux和MacOS。可以通过以下链接选择合适的安装方式https://pypi.org/project/pyheif/如果是Windows,我们只能下载whl依赖文件,使用pip命令安装下载地址:https:///www.lfd.uci.edu/~gohl...注意:我们需要根据系统和Python版本选择对应的文件安装#比如本机是win10+64位+Python3.7#下载通过以下链接下载文件:pyheif?0.6.1?cp37?cp37m?win_amd64.whlhttps://www.lfd.uci.edu/~gohlke/pythonlibs/#pyheif#然后执行虚拟环境#使用pip3命令即可安装whl文件pip3installpyheif?0.6.1?cp37?cp37m?win_amd64.whl然后安装图像处理的PIL依赖#安装依赖pip3installPillow3。实战首先,遍历源文件夹及子文件夹,获取所有HEIC格式的图片(不区分大小写)glob(r"{}/*.heic".format(source_path))#满足条件的文件列表filelist=[]forroot,dirnames,filenamesinos.walk(source_path):forfilenameinfilenames:#filename:文件名,root:文件对应的目录#获取文件后缀名file_end=pathlib.Path(filename).suffix#文件名(无后缀)file_name=pathlib.Path(filename).name.split(".")[-2]iffile_endin['.heic','.HEIC']:#文件的完整目录#file_path=os.path.join(root,filename)filelist.append({"filename":file_name,"filepath":os.path.join(root,filename)})returnfilelist然后,遍历文件列表,使用pyheif读取文件,使用PIL将其转换成二进制图片,以JPG格式保存到目标文件夹importpyheiffromPILimportImage#readfileimg=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))#saveimg_bytes.save(target_file_path,format="jpeg》)由于图片较多,图片阅读,图片保存图片是一个耗时的IO操作。最后修改程序,利用多线程加速图片转换。另外,图片可能有重复的文件名,在最后一次保存的文件名后附加一个随机字符串join(random.sample('abcdefghijklmnopqrstuvwxyz',count))defconvert_heic_to_jpg(file,semaphore):"""heicFormattojpg:paramfiles::return:"""semaphore.acquire()...#文件操作#Releasesemaphore.release()if__name__=='__main__':...#定义信号量并同时处理文件IOsemaphore=threading.BoundedSemaphore(20)forfileinfiles:t=threading.Thread(target=convert_heic_to_jpg,args=(file,semaphore))t.start()最后,通过以上操作,可以快速批量将HEIC文件转换为JPG文件。当然,如果你想把它转成其他图片,比如:PNG,你只需要改变PIL的格式就可以保存图片了。近期整理了数百G的Python学习资料,包括入门电子书、教程、源码等,免费分享给大家!想上“Python编程学习圈”,发“J”免费领取
