当我使用PIL时,为什么会出现“无法保存模式RGBA”错误?

8

我正在尝试将图像转换为PDF文档。 这是我的代码:

def convertToPDF(folder, PDFname, deleteLast=False):
    '''
    converts all images in a folder to a PDF. 
    '''
    imageList = []
    for filename in glob.glob(folder + f'/*'):
        image=Image.open(filename)
        image.convert('RGB') # convert to RGB
        imageList.append(image)

    imageList[0].save(f'./' + PDFname + '.pdf',save_all=True, append_images=imageList[1:]) # take the first image and add everything else

有时候我会遇到这个错误:

 File "c:\Users\felix\OneDrive\Desktop\Programmieren\TelegrammBotProjekt\manganeloAPI.py", line 195, in convertToPDF
   imageList[0].save(f'./' + PDFname + '.pdf',save_all=True, append_images=imageList[1:]) # take the first image and add everything else
 File "C:\Users\felix\Anaconda3\lib\site-packages\PIL\Image.py", line 2151, in save
   save_handler(self, fp, filename)
 File "C:\Users\felix\Anaconda3\lib\site-packages\PIL\PdfImagePlugin.py", line 41, in _save_all
   _save(im, fp, filename, save_all=True)
 File "C:\Users\felix\Anaconda3\lib\site-packages\PIL\PdfImagePlugin.py", line 156, in _save
   raise ValueError(f"cannot save mode {im.mode}")
ValueError: cannot save mode RGBA

有人知道这个问题是什么,并且如何解决吗? 我以为我已经将每个图像转换为'RGB'了。那么,为什么会出现这个错误?

2个回答

8

.convert('RGB') 不能在RGBRGBA之间进行转换; 它是用于在基于调色板的图像和RGB图像之间进行转换的(它的主要操作是P表示调色板,L表示单通道(灰度),RGB表示分离的通道)。

相反,您需要明确地去除alpha通道并进行转换。从链接的答案中可以看到:

from PIL import Image

png = Image.open(object.logo.path)
png.load() # required for png.split()

background = Image.new("RGB", png.size, (255, 255, 255))
background.paste(png, mask=png.split()[3]) # 3 is the alpha channel

你可以在图像列表中使用background,并将其保存为PDF。现在,你还明确地使这些图像具有白色背景。

1
from PIL import Image
import os

def convert_images_to_pdf(images_folder, pdf_file):
    images = []
    for file in os.listdir(images_folder):
        if file.endswith(".jpg") or file.endswith(".png"):
            image = Image.open(os.path.join(images_folder, file))
            if image.mode == 'RGBA':
                image = image.convert('RGB')
            images.append(image)
    images[0].save(pdf_file, save_all=True, append_images=images[1:])

convert_images_to_pdf('images', 'images.pdf')

1
请在您的答案中添加上下文,以解释它是如何解决问题以及与已提供的其他答案有何不同。 - DaveL17

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接