Pillow ImageColor 模块

下面给你一个 Pillow(PIL Fork)中 ImageColor 模块 的完整入门指南,包含所有颜色格式、转换方法、代码示例、调色板生成、渐变图制作及高级应用。
(基于 Pillow ≥ 9.0,Python 3.8+)


1. 安装 Pillow

pip install --upgrade pillow

2. 基本导入

from PIL import Image, ImageColor

3. 支持的颜色格式(ImageColor.getrgb()

格式示例说明
颜色名称"red", "darkblue"W3C 标准颜色
十六进制"#ff0000", "#00FF00"支持 3/6/8 位
RGB 元组(255, 0, 0)直接使用
HSLhsl(0, 100%, 50%)色相、饱和度、亮度
HSVhsv(120, 100%, 100%)色相、饱和度、明度

ImageColor.getrgb(color_str) → 统一返回 (R, G, B) 元组


4. 基础用法:颜色字符串 → RGB

print(ImageColor.getrgb("red"))          # (255, 0, 0)
print(ImageColor.getrgb("#00ff00"))      # (0, 255, 0)
print(ImageColor.getrgb("#0000FF80"))    # (0, 0, 255, 128) ← 带透明度
print(ImageColor.getrgb("hsl(120,100%,50%)"))  # (0, 255, 0)

5. 所有内置颜色名称(147种)

colors = ImageColor.colormap  # 字典:{'red': '#ff0000', ...}
print(len(colors))  # 147
print("aliceblue" in colors)  # True

常用颜色:

  • "white", "black", "gray", "silver"
  • "red", "green", "blue", "cyan", "magenta", "yellow"
  • "gold", "purple", "orange", "pink"

6. 实用函数

函数作用
ImageColor.getrgb(color)解析任意格式 → (R,G,B)(R,G,B,A)
ImageColor.getcolor(color, mode)按图像模式返回颜色(如 "RGB", "L"
# 按模式返回
rgb = ImageColor.getcolor("red", "RGB")     # (255, 0, 0)
gray = ImageColor.getcolor("red", "L")      # 76(灰度值)

7. 创意应用:生成渐变图

7.1 水平渐变(红 → 蓝)

def gradient_horizontal(size=(800, 200), start="#ff0000", end="#0000ff"):
    img = Image.new("RGB", size)
    start_rgb = ImageColor.getrgb(start)
    end_rgb = ImageColor.getrgb(end)

    for x in range(size[0]):
        ratio = x / (size[0] - 1)
        r = int(start_rgb[0] * (1 - ratio) + end_rgb[0] * ratio)
        g = int(start_rgb[1] * (1 - ratio) + end_rgb[1] * ratio)
        b = int(start_rgb[2] * (1 - ratio) + end_rgb[2] * ratio)
        for y in range(size[1]):
            img.putpixel((x, y), (r, g, b))

    return img

gradient_horizontal().save("gradient_h.jpg")

7.2 径向渐变(中心 → 边缘)

from math import sqrt

def radial_gradient(size=(500, 500), center_color="white", edge_color="black"):
    img = Image.new("RGB", size)
    cx, cy = size[0] // 2, size[1] // 2
    max_dist = sqrt(cx**2 + cy**2)
    c1 = ImageColor.getrgb(center_color)
    c2 = ImageColor.getrgb(edge_color)

    for x in range(size[0]):
        for y in range(size[1]):
            dist = sqrt((x - cx)**2 + (y - cy)**2)
            ratio = min(dist / max_dist, 1.0)
            color = tuple(int(c1[i] * (1 - ratio) + c2[i] * ratio) for i in range(3))
            img.putpixel((x, y), color)

    return img

radial_gradient().save("radial.jpg")

8. 调色板生成器(艺术配色)

def generate_palette(base_color, steps=10, mode="complementary"):
    base = ImageColor.getrgb(base_color)
    h, s, l = rgb_to_hsl(*base)
    palette = []

    if mode == "analogous":
        for i in range(steps):
            hue = (h + i * 30) % 360
            palette.append(hsl_to_rgb(hue, s, l))

    elif mode == "complementary":
        palette = [base, hsl_to_rgb((h + 180) % 360, s, l)]

    return [f"#{r:02x}{g:02x}{b:02x}" for r, g, b in palette]

# 辅助函数
def rgb_to_hsl(r, g, b):
    from colorsys import rgb_to_hls
    return rgb_to_hls(r/255, g/255, b/255)

def hsl_to_rgb(h, s, l):
    from colorsys import hls_to_rgb
    r, g, b = hls_to_rgb(h, s, l)
    return (int(r*255), int(g*255), int(b*255))

9. 完整示例:彩虹条纹

def rainbow_stripes(size=(800, 200), bands=7):
    img = Image.new("RGB", size)
    hues = [i * 360 // bands for i in range(bands)]

    band_height = size[1] // bands
    for i, hue in enumerate(hues):
        color = hsl_to_rgb(hue, 100, 50)
        for y in range(i * band_height, (i + 1) * band_height):
            for x in range(size[0]):
                img.putpixel((x, y), color)

    return img

rainbow_stripes().save("rainbow.jpg")

10. 高级技巧

10.1 动态生成 CSS 颜色变量

def export_css_palette(colors, filename="palette.css"):
    lines = [":root {"]
    for i, color in enumerate(colors):
        lines.append(f"  --color-{i}: {color};")
    lines.append("}")
    with open(filename, "w") as f:
        f.write("\n".join(lines))

export_css_palette(generate_palette("teal", mode="analogous"))

10.2 颜色拾取器(从图片提取主色)

def extract_dominant_color(img, k=1):
    from collections import Counter
    pixels = list(img.getdata())
    most_common = Counter(pixels).most_common(k)
    return [f"#{r:02x}{g:02x}{b:02x}" for (r,g,b), count in most_common]

img = Image.open("flower.jpg").resize((50,50))  # 缩小加速
print(extract_dominant_color(img, 3))

11. 常见问题

问题解决
ValueError: unknown color specifier检查拼写、格式(如 #fff vs #ffff
透明度丢失使用 getrgb() 后检查长度为 4
HSL 颜色偏暗l 是亮度,建议 50% 起步

12. 官方文档

  • https://pillow.readthedocs.io/en/stable/reference/ImageColor.html
  • 颜色表:https://pillow.readthedocs.io/en/stable/_images/colormap.png

一键工具脚本:color_tool.py

#!/usr/bin/env python3
import argparse
from PIL import ImageColor

def main():
    parser = argparse.ArgumentParser(description="ImageColor 工具")
    parser.add_argument("color", help="颜色字符串")
    parser.add_argument("--rgb", action="store_true")
    parser.add_argument("--hex", action="store_true")

    args = parser.parse_args()
    rgb = ImageColor.getrgb(args.color)

    if args.hex:
        print("#{:02x}{:02x}{:02x}".format(*rgb[:3]))
    elif args.rgb:
        print(rgb)
    else:
        print(f"RGB: {rgb}")
        if "a" in args.color.lower():
            print(f"Alpha: {rgb[3] if len(rgb)==4 else 255}")

if __name__ == "__main__":
    main()

使用

python color_tool.py "#ff8800" --hex    # ff8800
python color_tool.py "hsl(30,100%,50%)" --rgb  # (255, 128, 0)

需要我帮你实现 调色板生成器、渐变壁纸、图片主色提取、艺术滤镜配色 等功能吗?直接说需求,我给你完整代码!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注