Вопрос или проблема
Я пытаюсь извлечь изображения из PDF файла с помощью PyMuPDF (fitz), но сталкиваюсь с проблемой, когда извлеченные изображения имеют черный фон. Как я могу извлекать изображения, сохраняя прозрачный фон?
Я подозреваю, что это может быть связано с файлом PDF или форматом изображения. Если кто-то сталкивался с подобной проблемой, буду признателен за помощь!
Спасибо!
import fitz # PyMuPDF
import io
import os
from PIL import Image
def extract_images_from_pdf(pdf_path, output_folder):
doc = fitz.open(pdf_path)
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for page_number in range(len(doc)):
page = doc[page_number]
image_list = page.get_images(full=True)
for img_index, img in enumerate(image_list):
xref = img[0]
base_image = doc.extract_image(xref)
image_bytes = base_image["image"]
real_image = Image.open(io.BytesIO(image_bytes))
image_filename = f"page_{page_number + 1}_image_{img_index + 1}.png"
image_path = os.path.join(output_folder, image_filename)
real_image.save(image_path)
doc.close()
# Установите путь к PDF и папку вывода
pdf_path = "sample.pdf"
output_folder = "extracted_images"
extract_images_from_pdf(pdf_path)
Когда я запускаю этот код, извлеченные изображения отображаются с черным фоном, вместо того чтобы быть прозрачными, даже когда у них должен быть прозрачный фон.
Ответ или решение
При извлечении изображений из PDF-файлов с помощью библиотеки PyMuPDF (fitz) иногда возникает проблема с черным фоном вместо прозрачного, что может быть связано с тем, как обрабатываются альфа-каналы в изображениях.
Ваша текущая реализация кода почти корректна, но существует вероятность, что при сохранении изображений в формат PNG происходит потеря прозрачности из-за недостаточной обработки альфа-канала. Давайте внесем изменения, чтобы извлекать изображения с правильной прозрачностью.
import fitz # PyMuPDF
import io
import os
from PIL import Image
def extract_images_from_pdf(pdf_path, output_folder):
doc = fitz.open(pdf_path)
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for page_number in range(len(doc)):
page = doc[page_number]
image_list = page.get_images(full=True)
for img_index, img in enumerate(image_list):
xref = img[0]
base_image = doc.extract_image(xref)
image_bytes = base_image["image"]
# Открываем изображение с использованием PIL
real_image = Image.open(io.BytesIO(image_bytes))
# Проверяем, имеет ли изображение альфа-канал
if real_image.mode == 'RGBA':
real_image = real_image.convert('RGBA')
# Создаем новую картинку с прозрачным фоном
new_image = Image.new("RGBA", real_image.size)
# Копируем пиксели из оригинального изображения
for x in range(real_image.width):
for y in range(real_image.height):
r, g, b, a = real_image.getpixel((x, y))
# Если альфа-канал не нулевой, копируем, иначе оставляем прозрачным
if a > 0:
new_image.putpixel((x, y), (r, g, b, a))
real_image = new_image
image_filename = f"page_{page_number + 1}_image_{img_index + 1}.png"
image_path = os.path.join(output_folder, image_filename)
# Сохраняем изображение в формате PNG
real_image.save(image_path, format='PNG')
doc.close()
# Установите путь к PDF и папку для сохранения
pdf_path = "sample.pdf"
output_folder = "extracted_images"
extract_images_from_pdf(pdf_path, output_folder)
Что изменилось:
- Проверка альфа-канала: Мы проверяем, имеет ли изображение режим
RGBA
, который указывает на наличие альфа-канала. - Создание нового изображения: Если альфа-канал есть, создается новое изображение с теми же размерами и прозрачным фоном. Пиксели копируются только в том случае, если альфа-канал больше нуля.
- Сохранение изображений: Обратите внимание, что при сохранении мы указываем формат
PNG
, который поддерживает прозрачность.
Эти изменения должны помочь сохранить прозрачный фон при извлечении изображений из PDF-файлов, и вы больше не будете сталкиваться с черным фоном.