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

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

我正在尝试使用 python 将 HEIC 转换为 JPG。关于这个主题的唯一其他答案使用了 pyheif。我在 Windows 上,pyheif 不支持 Windows。有什么建议么?我目前正在尝试使用枕头。

python python-imaging-library jpeg heic
8个回答
17
投票

下面的代码将图片转换并保存为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"))

3
投票

截至今天,我还没有找到仅使用 Python 的解决方案来做到这一点的方法。如果您需要解决方法,您可以找到任何可以为您执行转换的 Windows 命令行实用程序,并将其作为 Python 的子进程调用。

以下是使用 PowerShell 的示例选项:https://github.com/DavidAnson/ConvertTo-Jpeg

如今,使用 Magick.NET 编写基于 .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
投票

只是在看同一主题。我遇到了这个:

https://pypi.org/project/heic-to-jpg/

我没有时间更多地研究这个,但我想我会分享这个。


1
投票

如果您需要一些与图像有关的 Pillow 操作,请使用 open_heifPIL.Image.open()

pillow-heif 支持lazy加载数据。

对于包含多个图像的文件,

read_heifread速度很慢,它将在调用期间解码所有图像。

P.S.:我是《pillow-heif》的作者。


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 a,然后再将其保存到本地文件系统。

此代码进行了一些重命名,因此可以将其保存为数据库中的 FileStorage 对象,并可以访问文件名和 mime 类型。

作为类转换器的功能。

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)
© www.soinside.com 2019 - 2024. All rights reserved.