在計算機繪圖中有兩種表示顏色值不透明度的方法。win2d 中兩種方法均有所採用。本文旨在解釋兩種方法之間的區別以及其各自的使用場景。
直接 alpha (straight alpha)
當使用直接,亦即線性 alpha 時:
在該方法中,rgb 和 alpha 通道各自獨立發揮作用。它們可以在不互相影響的情況下各自發生改變。要使乙個物件淡出,只需保持 rgb 取值不變,逐步減小 alpha 值即可。
以直接 alpha 格式實現兩種顏色的 source-over 模式混合:
預乘 alpha (premultiplied alpha)結果 = (源.rgb * 源.a) + (目標.rgb * (1 - 源.a))
當使用預乘 alpha 時:
在該方法中,rgb 通道和 alpha 通道相關聯。要使物件透明,則必須同時減少 rgb 值(減少顏色濃度)和 alpha 值(減輕對背景內容的掩藏幅度)。完全透明的物件不具有任何顏色,所以只有乙個值表示 100% 的透明度:rgb 和 alpha 值均為零。
以預乘 alpha 格式實現兩種顏色的 source-over 模式混合:
win2d 中的 alpha結果 = 源.rgb + (目標.rgb * (1 - 源.a))
win2d 在 api 層次上使用直接 alpha,而在內部渲染操作中使用預乘 alpha。
windows.ui.color
值為直接 alpha。 當你向draw
* 或fill
* 方法傳遞乙個顏色引數、設定畫刷的顏色或以某個顏色清屏時,該顏色使用的都是直接 alpha。
儲存在乙個位圖(bitmap)或者渲染目標(rendertarget)中的畫素值,以及在此層次上進行的繪製或混合操作均使用預乘 alpha。當位圖從檔案中載入時,其內容會自動轉為預乘格式。當你呼叫乙個 win2d 繪圖方法時,其顏色引數也會在繪圖實際發生前從直接轉換到預乘。
win2d 影象特效混合使用直接和預乘 alpha。部分特效使用其中一種格式,其它特效使用另一種格式,還有些特效提供了乙個屬性以供選擇。每種特效型別的文件均有描述該特效使用哪種 alpha 模式。特效的輸入資料總是會被假定為預乘格式,所以當乙個特效要應用直接 alpha,它會先執行一次反預乘變換,然後計算特效,最後在重新進行預乘輸出。
getpixelbytes
、setpixelbytes
、getpixelcolors
以及setpixelcolors
等位圖 api 並不 進行任何 alpha 格式轉換。它們進在底層 gpu 紋理與上層物件之間直接傳遞位值。通過以下方法可以觀察到 win2d 內部是如何處理 alpha 格式的:
在 alpha 格式之間進行轉換
要把直接 alpha 格式的顏色轉換為預乘 alpha 格式,將顏色的 r、g、b 三值分別乘以 a 值。要從預乘 alpha 轉換為直接 alpha,則將 r、g、b 三值分別除以 a 值。
注意顏色資訊通常以取值範圍從 0 到 255 的位元組值表示(例如windows.ui.color
結構由 4 個位元組組成)。這一表示以 255 為換算係數按比變化,故位元組值 255 即表示 1,而 128 即表示一半程度。在進行格式轉換時,必須帶入換算係數參與計算,因此將乙個windows.ui.color
從直接轉換到預乘的計算過程為:
如果現有影象資料的 alpha 格式不正確,可以使用 premultiplyeffect 或unpremultiplyeffect 特效進行轉換。預乘值.r = (byte)(直接值.r * 直接值.a / 255);
預乘值.g = (byte)(直接值.g * 直接值.a / 255);
預乘值.b = (byte)(直接值.b * 直接值.a / 255);
預乘值.a = 直接值.a;
Win2D 官方文章系列翻譯 畫素格式
directxpixelformat 列舉 包含了 direct3d 和 dxgi 所使用全部各種畫素格式,但其中只有部分被 win2d 所支援 或被 win2d 構建的基礎 direct2d 所支援 如果不確定該採用哪種格式,預設選擇b8g8r8a8uintnormalized作為畫素格式以及pr...
Win2D 官方文章系列翻譯 幕後繪製
應用有時需要將圖形繪製到並不立即顯示的目標上。此類繪製動作被稱作 幕後繪製 或 繪製到紋理 當應用需要將繪製操作輸出儲存到乙個檔案 返回為乙個畫素陣列或留作後續操作的輸入源時,常需要進行這種幕後繪製。通過使用 win2d 中的 canvasrendertarget 可以輕鬆實現以上場景。canvas...
Win2D 官方文章系列翻譯 調整控制項解析度
解析度與控制項縮放 本文中所用的 解析度 一詞,是指位圖的尺寸 高寬 win2d xaml 控制項繪製的物件均有解析度和 dpi 這兩項屬性。物件的 dpi 指示了繪製時其構成畫素的密度。dpi 就像縮放因數 dpi 越高則繪製物件構成的畫素數越多 反之,dpi 越低,其構成畫素數就越少。有關一般 ...