首页 > 解决方案 > 如何使用 Pillow 获得主色

问题描述

我想获取图像中使用的颜色(256/8 位)以及它们出现的次数。我希望能解决这个问题,image.getcolors()但我不知道如何将 8 位颜色值转换为 RGB。

from PIL import Image

original = Image.open('image.jpg')                   # Open image
reduced = original.convert("P", palette=Image.WEB)   # Convert to WEB palette (216 colors)
color_count = reduced.getcolors()                    # Get list of (count, color)

这工作正常,我得到一个颜色在 0 到 255 范围内的元组列表。如何获得这个 8 位像素的 RGB 值?

标签: pythonimagepython-imaging-library

解决方案


PIL 的 getpalette方法返回图像调色板的每个颜色索引的 RGB 值列表。不幸的是,所有 RGB 值都连接到一个列表中,因此您必须对结果进行后处理(即,将值 3 乘 3 分组)以获得您需要的结果。这是代码:

from PIL import Image

original = Image.open('test.png') # open RGB image
reduced = original.convert("P", palette=Image.WEB) # convert to web palette (216 colors)
palette = reduced.getpalette() # get palette as [r,g,b,r,g,b,...]
palette = [palette[3*n:3*n+3] for n in range(256)] # group 3 by 3 = [[r,g,b],[r,g,b],...]
color_count = [(n, palette[m]) for n,m in reduced.getcolors()]

print(color_count)

输出:

[(111230, [1, 1, 1]), (16063, [23, 23, 23]), (7468, [16, 8, 18]),
 (15, [237, 240, 163]), (3, [253, 249, 160]), ... ]

推荐阅读