如何使用python-pptx读取并修改自选图形的填充颜色

报错原因
之前的代码触发AttributeError: no .rgb property on color type '_NoneColor'核心是两个错误操作:
- 误用
shape.fill.solid():该方法的作用是将形状填充强制修改为纯色填充模式,属于写入操作,不是读取颜色前的初始化步骤,调用后会覆盖原有填充配置,容易清空原有颜色属性,生成空的_NoneColor对象。 - 未提前判断填充类型:只有形状填充为纯色类型时,
fore_color才携带可直接读取的rgb属性,无填充、渐变填充、主题绑定色等场景下直接访问rgb属性都会触发报错。
正确读取纯色自选图形颜色的方法
先导入需要的枚举类,判断填充类型后再读取颜色,兼容直接设置的RGB色和主题绑定色:
from pptx.enum.dml import MSO_FILL_TYPE from pptx.dml.color import RGBColor def get_shape_solid_fill_rgb(shape): fill = shape.fill # 无填充直接返回None if fill.type == MSO_FILL_TYPE.NO_FILL: return None # 非纯色填充(渐变、图案、图片填充等)抛出提示,可按需扩展对应读取逻辑 if fill.type != MSO_FILL_TYPE.SOLID: raise ValueError(f"形状填充类型为{fill.type},不属于纯色填充,无法直接读取RGB值") color = fill.fore_color # 直接设置的RGB颜色,直接返回 if color.type == 1: # 对应MSO_COLOR_TYPE.RGB return color.rgb # 绑定主题的配色,返回主题对应的RGB值 if color.type == 2: # 对应MSO_COLOR_TYPE.SCHEME return color.theme_color return None
颜色修改方法(含HSV调整逻辑)
使用Python标准库colorsys即可完成RGB和HSV的互转,不需要额外安装依赖,调整后再写回形状即可:
import colorsys from pptx.dml.color import RGBColor def adjust_shape_fill_hsv(shape, h_shift=0, s_scale=1.0, v_scale=1.0): """ 读取形状原有纯色后,通过HSV通道调整再写回 :param h_shift: 色相偏移量,取值范围0-1,0.5对应色相旋转180度 :param s_scale: 饱和度缩放比例,大于1更鲜艳,小于1更趋近灰度 :param v_scale: 明度缩放比例,大于1更亮,小于1更暗 """ # 先读取原有颜色 original_rgb = get_shape_solid_fill_rgb(shape) if not original_rgb: raise ValueError("无填充的形状无法做颜色调整") # 将0-255范围的RGB值转换为0-1区间供colorsys处理 r, g, b = [channel / 255.0 for channel in (original_rgb.r, original_rgb.g, original_rgb.b)] h, s, v = colorsys.rgb_to_hsv(r, g, b) # 调整HSV通道,裁剪值到0-1合法区间 new_h = (h + h_shift) % 1.0 new_s = max(0.0, min(1.0, s * s_scale)) new_v = max(0.0, min(1.0, v * v_scale)) # 转换回RGB格式 new_r, new_g, new_b = colorsys.hsv_to_rgb(new_h, new_s, new_v) new_rgb = RGBColor( int(new_r * 255), int(new_g * 255), int(new_b * 255) ) # 设置为纯色填充并应用新颜色 shape.fill.solid() shape.fill.fore_color.rgb = new_rgb
使用示例
# 读取第一个形状的填充色 current_rgb = get_shape_solid_fill_rgb(slide.shapes[0]) print(current_rgb) # 将第一个形状色相偏移0.1,饱和度提升20%,明度不变 adjust_shape_fill_hsv(slide.shapes[0], h_shift=0.1, s_scale=1.2)
注意:如果需要保留形状颜色和PPT主题的联动关系,不要直接写入固定RGB值,可自行调整
theme_color属性;如果需要做自定义HSV调色,直接写入固定RGB的方案兼容性最好。
内容的提问来源于stack exchange,提问作者Super-ilad
相关产品推荐
相关产品推荐

