Проблема с черным фоном при извлечении изображений из PDF с помощью PyMuPDF

Вопрос или проблема

Я пытаюсь извлечь изображения из 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)

Что изменилось:

  1. Проверка альфа-канала: Мы проверяем, имеет ли изображение режим RGBA, который указывает на наличие альфа-канала.
  2. Создание нового изображения: Если альфа-канал есть, создается новое изображение с теми же размерами и прозрачным фоном. Пиксели копируются только в том случае, если альфа-канал больше нуля.
  3. Сохранение изображений: Обратите внимание, что при сохранении мы указываем формат PNG, который поддерживает прозрачность.

Эти изменения должны помочь сохранить прозрачный фон при извлечении изображений из PDF-файлов, и вы больше не будете сталкиваться с черным фоном.

Оцените материал
Добавить комментарий

Капча загружается...