天天看點

【轉】[PPTX解析] 圖檔 重新着色存儲詳解

PPTX對圖檔進行重新着色和設定透明顔色這兩個行為,PPT并不會對原圖進行修改,而是通過将修改資訊直接存入xml中。也就是說不會生成一張處理過的圖檔,第三方應用需要擷取存儲資訊,解析後将原圖進行修改或通過着色器改變渲染效果。

原作者: 曉嗔戈

首先,讓我們來看一下PPTX提供了哪些重新着色的選項:

【轉】[PPTX解析] 圖檔 重新着色存儲詳解

可以看到,PPT的着色選項大體分為以下幾類:

效果類型

包含的選項

原理

GrayScaleEffect

灰階

将圖檔修改為灰階圖

ErosionEffect

沖蝕

修改圖檔的亮度和對比度

Black/WhiteEffect

黑白:25%、黑白:50%、黑白:75%、

根據指定門檻值将像素設為黑色或白色

DuotoneEffect

上述效果外的選項(包含其他變體)

對于每個像素,通過線性插值組合 clr1 和 clr2 以确定該像素的新顔色

需要注意的是,實際上重新着色是需要根據選擇的類型不同,其存儲方案也是不同的!(根據規範都是存儲在<code>&lt;a:blip /&gt;</code>節點中的)

在講解如何解析PPTX圖像存儲前,我們先來說明一下如何處理圖檔,将其按照我們的想法和輸入資料将其進行轉換。

在圖像進行中,我們通常使用矩陣來進行圖像的像素處理,下面是一些常見的C#圖像處理矩陣:

在擷取到這些處理的矩陣後,我們可以将其應用到圖檔上,代碼如下(C#):

接下來,就讓我們逐一的對存儲節點進行分析吧~

該屬性的标記非常簡單和清晰,使用了一個單一的節點**<code>&lt;a:grayscl /&gt;</code>**表明是否應用了該效果:

是以隻要在解析PPTX節點的過程之中,發現存在節點**<code>&lt;a:grayscl /&gt;</code>,就可以通過灰階濾波器矩陣**對圖檔做灰階處理即可。

該屬性通過節點**<code>&lt;a:lum /&gt;</code>**進行存儲,如下:

該節點屬性解析:

屬性名稱

屬性含義

值含義

補充說明

bright

亮度

正值表示增加亮度,負值表示降低亮度

機關:千倍百分比(如:70000實際值代表70%)

contrast

對比度

正值表示增加對比度,負值表示降低對比度

機關:千倍百分比(如:-70000實際值代表-70%)

是以隻要在解析PPTX節點的過程之中,發現存在節點**<code>&lt;a:lum /&gt;</code>,就可以通過亮度濾波器矩陣和對比度濾波器矩陣**對圖檔做處理即可。當然,如果學習過線性代數,那麼你應該是知道可以通過矩陣叉獲得一個連續轉換矩陣的吧~ 不要傻乎乎的真的分别将圖檔修改一次亮度,然後再修改一次對比度呦~

效果不一緻問題:

在實際轉換後,你可能會發現:應用亮度和對比度轉換時,當亮度和對比度修改值為正時,PPT的效果和運用轉換矩陣後的效果強度是不同的,并且PPT在設定亮度為最大值bright="100000"時,圖檔是全白的! 這是因為PPT運用的修改亮度算法和對比度算法與我們運用的算法是不同的(算法好多,而且還可以魔改)。這裡我們通過一個簡單的算法,得到一個轉化比例,讓轉換效果基本和PPT保持一緻一緻,代碼如下(C#):

例如,我們在處理亮度時,如果解析出bright=70000,那麼根據千倍百分比可以得出bright實際效果值應該為0.7,我們将0.7傳入**GetNearlyAmount()**即可獲得一個和PPT亮度修改效果近似的轉化比例。接下來調用CreateBrightnessMatrix(),就可以獲得亮度轉換矩陣了。(注意:當bright=100000時,我們直接建立一個純白的圖即可)。

該屬性通過節點**<code>&lt;a:biLevel /&gt;</code>**進行存儲,如下:

thresh

門檻值

像素點的亮度大于或等于給定的門檻值将顯示白色,否則顯示黑色

機關:千倍百分比(如:50000實際值代表50%)

注:在.NET中,我們可以通過<code>Color.GetBrightness()</code>擷取像素亮度。如何設定像素顔色的方法有很多,在此就不進行叙述了。

這個效果是PPT重新着色中最複雜的效果。 該屬性通過節點**<code>&lt;a:duotone /&gt;</code>**進行存儲,如下:

**<code>&lt;a:duotone /&gt;</code>**節點解析:

子節點名稱

含義

a:prstClr

預設顔色

指定實際的預設顔色值

實際上就是一個顔色,我們稱其為A

a:srgbClr

RGB顔色

實際顔色值,表示為十六進制數字 RRGGBB 的序列

實際上就是一個顔色,我們稱其為B

**<code>&lt;a:srgbClr /&gt;</code>**節點解析:

a:tint

色調

指定以百分比值表示的色調。

a:satMod

飽和度調制

指定輸入顔色,其飽和度按給定百分比進行調制。

機關:千倍百分比 (50%将飽和度降低一半,200%使飽和度加倍)

實踐出真知 看過上面的解析,是不是覺得它的解析很複雜,請忘掉上面的内容!看下面經過實踐驗證的解析:

經過實踐驗證,節點**<code>&lt;a:duotone /&gt;</code>**支援并實際存放的是兩個顔色,下面稱為<code>A</code>,<code>B</code>

下面我們使用色相環去檢測不同順序和顔色對最終效果的影響:

【轉】[PPTX解析] 圖檔 重新着色存儲詳解

序列

顔色A

顔色B

結果

1

全白

2

全黑

3

全紅

4

【轉】[PPTX解析] 圖檔 重新着色存儲詳解

5

【轉】[PPTX解析] 圖檔 重新着色存儲詳解

6

【轉】[PPTX解析] 圖檔 重新着色存儲詳解

7

【轉】[PPTX解析] 圖檔 重新着色存儲詳解

8

【轉】[PPTX解析] 圖檔 重新着色存儲詳解

9

【轉】[PPTX解析] 圖檔 重新着色存儲詳解
RGB 轉為灰階值的心理學公式 Gray = 0.30R + 0.59G + 0.11B
【轉】[PPTX解析] 圖檔 重新着色存儲詳解

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。歡迎轉載、使用、重新釋出,但務必保留文章署名林德熙,不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我