使用元数据将 HEIC 转换为 JPEG

问题描述 投票:0回答:3

我正在尝试在 jpeg 中转换 heic 文件,同时导入所有元数据(如 gps 信息和其他内容),不幸的是,使用下面的代码转换是可以的,但创建的 jpeg 文件中没有存储任何元数据。 任何人都可以描述我需要在转换方法中添加什么?

heif_file = pyheif.read("/transito/126APPLE_IMG_6272.HEIC")
image = Image.frombytes(
    heif_file.mode,
    heif_file.size,
    heif_file.data,
    "raw",
    heif_file.mode,
    heif_file.stride,
)
image.save("/transito/126APPLE_IMG_6272.JPEG", "JPEG")
python jpeg exif data-conversion heic
3个回答
6
投票

谢谢,我找到了解决方案,希望可以帮助其他人:

# Open the file
heif_file = pyheif.read(file_path_heic)

# Creation of image 
image = Image.frombytes(
    heif_file.mode,
    heif_file.size,
    heif_file.data,
    "raw",
    heif_file.mode,
    heif_file.stride,
)
# Retrive the metadata
for metadata in heif_file.metadata or []:
    if metadata['type'] == 'Exif':
        exif_dict = piexif.load(metadata['data'])

# PIL rotates the image according to exif info, so it's necessary to remove the orientation tag otherwise the image will be rotated again (1° time from PIL, 2° from viewer).
exif_dict['0th'][274] = 0
exif_bytes = piexif.dump(exif_dict)
image.save(file_path_jpeg, "JPEG", exif=exif_bytes)

3
投票

这是另一种将 iPhone HEIC 图像转换为 JPG 并保留 exif 数据的方法

  1. Pyhton 3.9(我使用的是 Rasperry PI 4 64 位)
  2. 安装pillow_heif (0.8.0)

然后运行以下代码,您将在新的 JPEG 图像中找到 exif 数据。 诀窍是获取字典信息。无需额外转换。

这是示例代码,围绕它构建了您自己的包装器。

    from PIL import Image
    import pillow_heif

    # open the image file
    heif_file = pillow_heif.read_heif("/mnt/pictures/test/IMG_0001.HEIC")
   
    #create the new image
    image = Image.frombytes(
    heif_file.mode,
    heif_file.size,
    heif_file.data,
    "raw",
    heif_file.mode,
    heif_file.stride,
    )

    print(heif_file.info.keys())
    dictionary=heif_file.info
    exif_dict=dictionary['exif']
    # debug 
    print(exif_dict)
    
    image.save('/tmp/test000.JPG', "JPEG", exif=exif_dict)

2
投票

HEIF 转 JPEG:

from PIL import Image
import pillow_heif

if __name__ == "__main__":
    pillow_heif.register_heif_opener()
    img = Image.open("any_image.heic")
    img.save("output.jpeg")

JPEG 到 HEIF:

from PIL import Image
import pillow_heif

if __name__ == "__main__":
    pillow_heif.register_heif_opener()
    img = Image.open("any_image.jpg")
    img.save("output.heic")
  1. 旋转(XMP 的 EXIF)将在需要时自动删除。

  2. 调用

    register_heif_opener
    可以通过导入
    pillow_heif.HeifImagePlugin
    而不是
    pillow_heif

    来替换
  3. 元数据可以在 Pillow 的“info”字典中编辑,并在保存到 HEIF 时保存。

© www.soinside.com 2019 - 2024. All rights reserved.