2 回答
TA貢獻1735條經驗 獲得超5個贊
在 PowerPoint(在這方面與 CSS 大致相似)中,字體屬性可以應用于(至少某些人稱之為)樣式層次結構中的各種級別。這些的底層覆蓋了上面的任何級別,將樣式直接應用于特定的運行。僅直接施加這樣的屬性可以使用類似的屬性來檢索.bold和.color。
有可能是屬性,如.effective_bold和.effective_color其導航樣式層次算得了什么價值將在渲染時被應用,但目前還沒有(還)。
因此,該None值font.color.rgb表示 run從其樣式層次結構(例如,段落默認值、形狀默認值、主題或演示默認值等)繼承其顏色設置,但不幸的是,它不會遍歷樣式層次結構以確定其有效顏色設置是什么。
TA貢獻1799條經驗 獲得超6個贊
我對填充也有同樣的需求。差別不是那么大。它以類似的方式工作。簡化只是將“fill.fore_color”更改為“font.color”。
首先是檢查給定的顏色是否特定(rgb 不是 None)。如果是你已經得到了。如果沒有,請追求主題顏色路徑以從那里獲取 RGB 值。
srgb = font.color.rgb
if srgb == None:
theme_color = font.color.theme_color
brightness = font.color.brightness
現在你擁有的是一個 theme_color 和一個亮度。主題顏色實際上是一個數值,用于定義 PowerPoint 中使用的“強調”顏色。它可以通過 MSO_THEME_COLOR 解析,通過私有字典“_member_to_xml”,您可以使用它來定義提取它所需的 xml 路徑:
from pptx.enum.dml import MSO_THEME_COLOR
accent = MSO_THEME_COLOR._member_to_xml[theme_color]
xpath = 'a:themeElements/a:clrScheme/a:{}/a:srgbClr/@val'.format(accent)
要進行提取,您需要有適當的可用主題信息,您可以通過從您所在的當前幻燈片使用的布局定義的 slide_master 中提取主題信息來獲得這些信息。為此需要更多導入:
from pptx.opc.constants import RELATIONSHIP_TYPE as RT
from pptx.oxml import parse_xml
slide_master_part = slide.slide_layout.slide_master.part
theme_part = slide_master_part.part_related_by(RT.THEME)
theme = parse_xml(theme_part.blob) # theme here is an <a:theme> element
現在終于,你有什么需要找出使用什么 PPT 強調色,回到我們之前定義的 xpath,并使用我們剛剛找到的主題翻譯它:
hex_color = theme.xpath(xpath)[0]
如果沒有亮度(亮度為零),您的 hex_color 不僅定義了使用的口音,還定義了真正的 RGB 顏色。這是使用您想要的任何方法從十六進制顏色值中提取的。例如圖像顏色:
from PIL import ImageColor
import numpy as np
srgb = np.array(ImageColor.getcolor('#{}'.format(hex_color), 'RGB'))
但是,如果亮度(我們在開始時找到主題顏色時發現的)不為零,我們還有更多工作要做。然后,真實顏色比由亮度值定義的強調色更暗或更亮。獲得真實 RGB 所需的額外步驟需要調整該亮度。以與 PowerPoint 中類似的方式使顏色更亮需要轉換為 HSL。然后改變亮度,然后轉換回RGB:
import colorsys
srgb = srgb / 255
h, luminance, s = colorsys.rgb_to_hls(*srgb)
lum_mod = 100000 * (1 - brightness)
lum_off = 100000 * brightness
luminance = luminance * (lum_mod / 100000) + (lum_off / 100000)
srgb = np.array(colorsys.hls_to_rgb(h, luminance, s))
srgb = (srgb * 255).round(0).astype(int)
我根據需要在上面顯示了做一種顏色的步驟。每張幻燈片只需要找到幻燈片母版主題一次,實際上在 PPT 演示文稿中每個母版只需要一次。因此,真正的代碼最好拆分為適合您需求的順序。
添加回答
舉報
