如何在Windows上使用Python将HEIC转换为JPG

12

我正在尝试使用Python将HEIC转换为JPG。关于这个主题的其他答案都使用了pyheif,但我在Windows上,而pyheif不支持Windows。你有什么建议吗?我目前正在尝试使用pillow。


我有同样的问题。你想到解决办法了吗? - koder613
请尝试访问 https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyheif - cgohlke
8个回答

21

以下代码将图像转换并保存为PNG格式

from PIL import Image
import pillow_heif

    heif_file = pillow_heif.read_heif("HEIC_file.HEIC")
    image = Image.frombytes(
        heif_file.mode,
        heif_file.size,
        heif_file.data,
        "raw",
    
    )

    image.save("./picture_name.png", format("png"))

1
这个可行,应该是答案。 - jjz
类型错误:参数1必须是只读的类似字节的对象,而不是memoryview。我将heif_file.data更改为heif_file.data.tobytes(),然后它就可以工作了。 - undefined

3
截至今天,我还没有找到一种仅使用Python的解决方案来完成这个任务。如果您需要解决方法,您可以查找任何Windows命令行实用程序来为您进行转换,并从Python中调用该实用程序作为子进程。
以下是一个使用PowerShell的示例选项: https://github.com/DavidAnson/ConvertTo-Jpeg 现在编写基于.NET的控制台应用程序并使用Magick.NET也很容易。这就是我最终所做的。

2

为我工作。

from PIL import Image
import pillow_heif


pillow_heif.register_heif_opener()

img = Image.open('c:\image.HEIC')
img.save('c:\image_name.png', format('png'))

1

虽然这个链接可能回答了问题,但最好在此处包含答案的必要部分并提供参考链接。如果链接页面发生更改,仅限链接的答案可能变得无效。-【来自评论】 - ramzeek
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community
heic-to-jpg readme 在 Windows 上有如下警告: ⚠️ 请注意,此程序仅在 macOS 上进行了测试。在其他操作系统上可能会出现问题 - Aaron Faltesek

1

如果您需要使用Pillow处理图像,请使用open_heifPIL.Image.open()

pillow-heif支持惰性数据加载。

read_heifread在包含多个图像的文件中运行缓慢,会在调用过程中解码所有图像。

附言:我是pillow-heif的作者。


嗨,亚历山大,感谢你为pillow添加heif支持。我使用pillow-heif时遇到了奇怪的问题:当我尝试调整JPG文件大小时,只需几毫秒即可加载它们。但是,当我尝试使用您的插件打开HEIC照片时,在EC2上的英特尔处理器上加载图片需要约1秒钟的时间。有没有什么方法可以提高HEIC的加载速度? - mityaika07
这类问题应该在 GitHub 上提出,附上一个示例,我们会看看能做些什么。 - Alexander Piskun

0
在最新版本的pillow_heic模块中,以下代码将正常工作。只需将read_heif替换为read即可。
from PIL import Image

import pillow_heif

heif_file = pillow_heif.read(r"E:\image\20210914_150826.heic")

image = Image.frombytes(
    heif_file.mode,
    heif_file.size,
    heif_file.data,
    "raw",

)

image.save(r"E:\image\test.png", format("png"))

0
我使用这段代码将表单中的一张HEIC图片转换为JPEG图像,然后保存到本地文件系统。
此代码执行一些重命名操作,以便可以将其保存为FileStorage对象,并可以访问文件名和MIME类型。
这是Converter类的一个函数。
import io
from PIL import Image
import pillow_heif
from werkzeug.datastructures import FileStorage

class Converter:

    def convert_heic_to_jpeg(self, file):
        # Check if file is a .heic or .heif file
        if file.filename.endswith(('.heic', '.heif', '.HEIC', '.HEIF')):
            # Open image using PIL
            # image = Image.open(file)

            heif_file = pillow_heif.read_heif(file)
            image = Image.frombytes(
                heif_file.mode,
                heif_file.size,
                heif_file.data,
                "raw",
            )

            # Convert to JPEG
            jpeg_image = image.convert('RGB')

            # Save JPEG image to memory temp_img
            temp_img = io.BytesIO()
            jpeg_image.save(temp_img, format("jpeg"))

            # Reset file pointer to beginning of temp_img
            temp_img.seek(0)

            # Create a FileStorage object
            file_storage = FileStorage(temp_img, filename=f"{file.filename.split('.')[0]}.jpg")

            # Set the mimetype to "image/jpeg"
            file_storage.headers['Content-Type'] = 'image/jpeg'

            return file_storage
        else:
            raise ValueError("File must be of type .heic or .heif")

0
这是一个简单的实现,可以将一个文件夹中的文件从HEIC格式转换为JPG格式。
    import os
    from PIL import Image
    import pillow_heif
    
    
    def convert_heic_to_jpeg(heic_path, jpeg_path):
        img = Image.open(heic_path)
        img.save(jpeg_path, format='JPEG')
    
    
    def convert_all_heic_to_jpeg(input_folder, output_folder):
        # Register HEIF opener with Pillow
        pillow_heif.register_heif_opener()
    
        # Create output folder if it doesn't exist
        if not os.path.exists(output_folder):
            os.makedirs(output_folder)
    
        # List all files in input folder
        for filename in os.listdir(input_folder):
            # Check if file is a HEIC file
            if filename.endswith(".heic") or filename.endswith(".HEIC"):
                # Build full path to input and output file
                heic_path = os.path.join(input_folder, filename)
                jpeg_filename = f'{os.path.splitext(filename)[0]}.jpg'
                jpeg_path = os.path.join(output_folder, jpeg_filename)
    
                # Convert HEIC to JPEG
                convert_heic_to_jpeg(heic_path, jpeg_path)
    
    
    # Example usage
    input_folder = 'images'
    output_folder = 'converted'
    convert_all_heic_to_jpeg(input_folder, output_folder)

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