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)
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐