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_heif
def 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 glob
def 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 glob
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
def 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)
更多推荐



所有评论(0)