livp文件使用python转换为heic或jpeg格式
livp是苹果手机的实况照片格式,livp即(Live Photos)。文件包含一张静态图片,以及一段1.5秒的短视频。但该格式并不通用,在WINDOWS电脑上不能直接查看,给后续的处理带来不便,经常需要转换为JPG/JPEG格式。
1 直接查看
文件本质上是ZIP格式,把后缀名改成zip即可解压缩内容。如将自己的图片 2024-12-13 133721.livp
重命名为2024-12-13 133721.zip
后,显示内容如下:
但问题又来了:
- HEIC格式在iOS设备上表现出色,但是它并不被所有设备所支持。但至少为后续的处理带来了可能。
- heic文件名与初始的文件名不一致,不能保留最初文件名信息,文件多了容易混淆
2 处理思路
由于livp是zip文件,可以直接用python自带的zipfile包,单独取出HEIC文件,重命名为与原文件一致的名称,最后转换为JPEG即可。
所需要的库:
- zipfile: python自带
- PIL/pillow: 处理图片
- pillow-heif:处理heif文件
pip install pillow pillow-heif
3 livp转heic
如果不需要指定目标文件名,自动转换为与livp同名的heic文件。
源文件:test.livp
目标文件:out/test.heic
import zipfile
import os
# input_file可以不用修改livp后缀,直接使用
def livp_to_heic(input_file,target_directory="./out"):base_name=os.path.basename(input_file) #获取含扩展名的文件名 with zipfile.ZipFile(input_file,"r") as files:for file in files.namelist():if file.endswith(".heic"):extracted_file=files.extract(file,target_directory)target_file=f"{target_directory}/{base_name[:-5]}.heic"os.rename(extracted_file,target_file)# 返回目标文件return target_file
测试:
livp_file="test.livp"
livp_to_heic(livp_file)
生成out目录并输出文件:
4 heic转为jpg文件
from PIL import Image
import pillow_heifdef heic_to_jpg(input_file, output_file,remove_input_file=False):heif_file = pillow_heif.read_heif(input_file)image = Image.frombytes(heif_file.mode, heif_file.size, heif_file.data,"raw",heif_file.mode,heif_file.stride,)image.save(output_file, "JPEG")if remove_input_file:os.remove(input_file)
测试:
input_file='./out/test.heic'
target_file="./out/test.jpg"
heic_to_jpg(input_file,target_file)
5 批量将livp文件转为jpg/jpeg文件
使用glob库遍历文件,先转为heic,再转换为jpg
import globdef livp_to_jpg(path="./*.livp"):for file in glob.glob(path):heic_file=livp_to_heic(file)target_file=heic_file.replace(".heic",".jpg")heic_to_jpg(heic_file,target_file)
6 所有代码
import zipfile
import os
from PIL import Image
import pillow_heif
import globdef livp_to_heic(input_file,target_directory="./out"):base_name=os.path.basename(input_file) #获取含扩展名的文件名 with zipfile.ZipFile(input_file,"r") as files:for file in files.namelist():if file.endswith(".heic"):extracted_file=files.extract(file,target_directory)target_file=f"{target_directory}/{base_name[:-5]}.heic"os.rename(extracted_file,target_file)# 返回目标文件return target_filedef heic_to_jpg(input_file, output_file,keep_heic=False):heif_file = pillow_heif.read_heif(input_file)image = Image.frombytes(heif_file.mode, heif_file.size, heif_file.data,"raw",heif_file.mode,heif_file.stride,)image.save(output_file, "JPEG")if not keep_heic:os.remove(input_file) def livp_to_jpg(folder="./",keep_heic=False):for file in glob.glob(os.path.join(folder,"*.livp")): heic_file=livp_to_heic(file)target_file=heic_file.replace(".heic",".jpg")heic_to_jpg(heic_file,target_file,keep_heic)
使用:
# 传入livp参数目录,并指定是否保留中间文件
livp_to_jpg("d:/download",keep_heic=False)