1.前言最近打算做一批亲友的挂历,但是iPhone导出的照片格式是HEIC格式,商家在线制作网站不支持这种图片格式PS:HEIC是新的Apple默认采用的图片格式,可以在不损失图片质量的情况下缩小图片尺寸。支持图片批量转换的网上网站很多,但安全和隐私得不到保障;如果用PS等软件一张一张转换,既浪费时间又效率太低。本文将使用Python批量转换HEIC图片文件。2.准备工作首先,我们安装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格式(不区分大小写)图片"{}/*.heic".format(source_path))#满足条件的文件列表filelist=[]forroot,dirnames,filenaMESinOS.Walk(Source_Path):forFilenameinFilenames:#FILENAME:文件名,root:文件对应的目录#Getthefilekicknamefile_END=PATHLIB.Path(FILENAME).=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)})返回FileList,使用pyheif读取文件,使用Pil切换为二进制图片。,以JPG格式保存到目标文件夹importpyheiffromPILimportImage#读取文件img=pyheif.read(filepath)img_bytes=Image.frombytes(mode=img.mode,size=img.size,data=img.data)#filesavecompletedirectorytarget_file_path='{}/{}_{}.jpg'.format(target_path,filename,generate_random_num(6))#saveimg_bytes.save(target_file_path,format="jpeg")由于数量较多图片,图片阅读1、图片保存是一个耗时的IO操作。最后,对程序进行修改,利用多线程加速图像转换。另外,图片可能有重复的文件名,在最后保存的文件名后附加一个随机字符串join(random.sample('abcdefghijklmnopqrstuvwxyz',count))defconvert_heic_to_jpg(file,"semaphore):"Heicformattojpg:paramfiles::return:"""semaphore.acquire()...#文件操作#释放semaphore.release()if__name__=='__main__':...#定义信号量,并发处理文件IOsemaphore=threading.BoundedSemaphore(20)forfileinfiles:t=threading.Thread(target=convert_heic_to_jpg,args=(file,semaphore))t.start()4.最后通过上面的操作可以快速的将HEIC文件批量转换成JPG文件,当然如果你想转换成其他图片,比如PNG,PIL保存的图片只需要改一下格式就可以了,如果觉得文章还不错,欢迎关注公众号:Pythonprogramming学习圈,或者去编程学习网学习更多编程技术知识,还有大量的干货学习资料!
