You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PyMuPDF提取PDF图像出现颜色反转问题求解决方案

解决PyMuPDF提取PDF图像颜色反转问题

原因分析

颜色反转大多是因为PDF中的图像采用CMYK色彩空间,PyMuPDF默认导出时未正确转换为RGB,或是部分图像因Alpha通道/负片格式导致色彩显示异常。

有效解决方案

方案1:使用PyMuPDF内置色彩转换

PyMuPDF(fitz)自带色彩空间转换能力,无需依赖过时第三方命令,提取时可直接指定转换为RGB:

import fitz  # PyMuPDF

def extract_images(pdf_path):
    doc = fitz.open(pdf_path)
    for page_num in range(len(doc)):
        page = doc[page_num]
        image_list = page.get_images(full=True)
        for img_index, img in enumerate(image_list):
            xref = img[0]
            pix = fitz.Pixmap(doc, xref)
            # 处理CMYK转RGB
            if pix.colorspace.n == 4:  # 4代表CMYK色彩空间
                pix = fitz.Pixmap(fitz.csRGB, pix)
            # 保存图像
            pix.save(f"page_{page_num}_img_{img_index}_fixed.png")
            pix = None  # 释放内存
    doc.close()

extract_images("your_pdf_file.pdf")

方案2:修复负片式颜色反转

若图像呈现黑白反转的负片效果,可通过反转像素值修正:

from PIL import Image
import numpy as np

# 读取异常图像
img = Image.open("reversed_img.png")
# 反转像素
fixed_img = Image.fromarray(np.invert(np.array(img)))
fixed_img.save("corrected_img.png")

方案3:结合PyMuPDF与Pillow处理复杂色彩

如果内置转换效果不佳,可结合Pillow完成更精细的色彩转换:

import fitz
from PIL import Image
import io

def extract_and_fix(pdf_path):
    doc = fitz.open(pdf_path)
    for page_num in range(len(doc)):
        page = doc[page_num]
        for img_index, img in enumerate(page.get_images(full=True)):
            xref = img[0]
            pix = fitz.Pixmap(doc, xref)
            # CMYK转RGB
            if pix.colorspace.n == 4:
                pix = fitz.Pixmap(fitz.csRGB, pix)
            # 转为Pillow图像处理
            img_pil = Image.open(io.BytesIO(pix.tobytes()))
            # 若仍有反转问题,取消下方注释
            # img_pil = Image.fromarray(np.invert(np.array(img_pil)))
            img_pil.save(f"page_{page_num}_img_{img_index}_final.png")
            pix = None
    doc.close()

补充说明

  • 优先使用PyMuPDF内置的fitz.Pixmap转换,避免依赖第三方库的废弃接口。
  • 若转换后颜色仍偏色,可尝试加载对应ICC色彩配置文件修正(需自行下载适配的CMYK ICC文件):
from PIL import ImageCms

# 加载CMYK与RGB配置文件
cmyk_profile = ImageCms.ImageCmsProfile("USWebCoatedSWOP.icc")
rgb_profile = ImageCms.createProfile("sRGB")
# 转换色彩空间
img_cmyk = Image.open("cmyk_img.png")
img_rgb = ImageCms.profileToProfile(img_cmyk, cmyk_profile, rgb_profile)
img_rgb.save("rgb_corrected.png")

内容的提问来源于stack exchange,提问作者olivia harman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 09:45:18