如何使用Python Pillow替换图片颜色并支持直接传入HEX色值?
实现方法
你可以直接用Pillow内置的ImageColor.getrgb()方法将HEX十六进制色值直接转换为Pillow可识别的RGB元组,无需手动解析色值。
具体改造步骤
- 导入
ImageColor模块 - 提前定义要替换的原颜色、目标HEX色值,转换为RGB格式
- 替换原有代码里写死的RGB数值即可
改造后完整代码
from PIL import Image, ImageColor import numpy as np # 定义颜色映射:key为原RGB颜色,value为目标HEX色值 color_map = { (0, 0, 0): "#FFFF00", # 黑色替换为黄色 (255, 255, 255): "#FF0000" # 白色替换为红色 } # 提前把HEX转成RGB元组 converted_map = {k: ImageColor.getrgb(v) for k, v in color_map.items()} img = Image.open("TbnlF.png") width, height = img.size for i in range(width): for j in range(height): current_rgb = img.getpixel((i, j))[:3] # 忽略可能存在的alpha通道 if current_rgb in converted_map: img.putpixel((i, j), converted_map[current_rgb]) img.save("changed.png")
手动解析HEX的可选方案
如果你不想额外导入模块,也可以自己写简单的转换逻辑处理HEX色值:
def hex_to_rgb(hex_str): # 去除#号前缀 hex_str = hex_str.lstrip('#') # 每两位转成16进制整数,返回RGB元组 return tuple(int(hex_str[i:i+2], 16) for i in (0, 2, 4)) # 调用示例:hex_to_rgb("#FF0000") 会返回(255, 0, 0)
更高效率的优化方案(适合大尺寸图片)
你已经导入了numpy,可以用向量化操作替代双重循环,处理速度提升非常明显:
from PIL import Image, ImageColor import numpy as np color_map = { (0, 0, 0): "#FFFF00", (255, 255, 255): "#FF0000" } converted_map = {k: ImageColor.getrgb(v) for k, v in color_map.items()} img = Image.open("TbnlF.png") img_arr = np.array(img) for old_rgb, new_rgb in converted_map.items(): # 匹配所有和原颜色一致的像素,批量替换 mask = np.all(img_arr[..., :3] == old_rgb, axis=-1) img_arr[mask] = new_rgb Image.fromarray(img_arr).save("changed.png")
内容的提问来源于stack exchange,提问作者project.py
相关产品推荐
相关产品推荐

