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) | 直接使用 |
| HSL | hsl(0, 100%, 50%) | 色相、饱和度、亮度 |
| HSV | hsv(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)
需要我帮你实现 调色板生成器、渐变壁纸、图片主色提取、艺术滤镜配色 等功能吗?直接说需求,我给你完整代码!