HEIC转JPEG格式并保留元数据。

9
我正在尝试将heic文件转换为jpeg,并导入所有元数据(如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")

这可能会有所帮助 https://dev59.com/PFQJ5IYBdhLWcg3wlm7B - jkr
谢谢,我通过这个解决了它: - Trics
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)

1
注意:这需要pyheif库,但它在Windows上不可用... - 576i
如何修复此程序中的错误?NameError:名称'piexif'未定义,谢谢。 - Pullat Junaid
只需通过pip3安装它(pip3 install piexif),愉快的编程之旅。 - Trics

3

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

  1. 需要使用Python 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. 需要时,旋转(EXIF或XMP)将被自动删除。

  2. 可以通过导入pillow_heif.HeifImagePlugin代替register_heif_opener来调用。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接