"ValueError: cannot allocate more than 256 colors" when using ImageDraw.Draw()

"ValueError: cannot allocate more than 256 colors" when using ImageDraw.Draw()

我有以下代码:

def draw():
    img = Image.open(image)
    draw = ImageDraw.Draw(img)
    font = ImageFont.truetype("Poppins-Thin.ttf", 20)
    watermark_text = "some text"
    draw.text((0, img.height - 25), watermark_text, (211, 211, 211), font=font)
    return img

它适用于一些图像,但有些会抛出 ValueError: cannot allocate more than 256 colors 错误。在没有 draw 功能的情况下处理失败的图像(我正在调整大小并压缩它)。

如何让它适用于所有支持的图像?

Working image example.

Failing image example.

此图像使用 indexed-colors(它在列表中保留 RGB 颜色,每个像素只有该颜色的索引)并且它可能只使用 256 个索引。 这样文件更小,它使用更少的内存 RAM 和更少的磁盘 space,并且网页可以更快地加载它 - 所以用户不会放弃访问页面(并且服务器发送更少的字节所以它的成本更低)

您必须转换为 RGB(或 RGBA,如果您想保持透明背景)

img = img.convert('RGBA')

最终,您可以使用某些颜色的索引(即 221),而不是

中的元组 (R,G,B)
draw.text((0, img.height - 25), watermark_text, 211)

但是很难识别图像上的颜色。


您可以使用

检测托盘类型(模式)
print(img.mode)

这里explanations