我正在尝试使用 python 将 HEIC 转换为 JPG。关于这个主题的唯一其他答案使用了 pyheif。我在 Windows 上,pyheif 不支持 Windows。有什么建议么?我目前正在尝试使用枕头。
下面的代码将图片转换并保存为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"))
截至今天,我还没有找到仅使用 Python 的解决方案来做到这一点的方法。如果您需要解决方法,您可以找到任何可以为您执行转换的 Windows 命令行实用程序,并将其作为 Python 的子进程调用。
以下是使用 PowerShell 的示例选项:https://github.com/DavidAnson/ConvertTo-Jpeg
如今,使用 Magick.NET 编写基于 .NET 的控制台应用程序也非常容易。这就是我最终所做的。
为我工作。
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'))
如果您需要一些与图像有关的 Pillow 操作,请使用 open_heif 或 PIL.Image.open()。
pillow-heif 支持lazy加载数据。
对于包含多个图像的文件,read_heif和read速度很慢,它将在调用期间解码所有图像。
P.S.:我是《pillow-heif》的作者。
在最新版本的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"))
我使用此代码将图像从 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")
这是一个将文件文件夹从 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)