"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
功能的情况下处理失败的图像(我正在调整大小并压缩它)。
如何让它适用于所有支持的图像?
此图像使用 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)
我有以下代码:
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
功能的情况下处理失败的图像(我正在调整大小并压缩它)。
如何让它适用于所有支持的图像?
此图像使用 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)