使用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
相关产品推荐
相关产品推荐

