14 2 1 F 中的顏色計算

2021-08-26 11:42:41 字數 1828 閱讀 4620

14.2.1 f# 中的顏色計算

若要實現圖形效果,比如模糊或灰階化,我們需要執行顏色的計算。我們可以使用 system.drawing 中標準的 color 型別,但是,我們可能需要把它分開成紅色、綠色和藍色的元件處理,這並不總是很方便。

listing 14.9 implementing color type with operators (f#)

type ******color(r:int, g:int, b:int) =

member x.r = r

member x.g = g

member x.b = b

member x.clipcolor() =

let check(c) = min 255 (max 0 c)

******color(check(r), check(g), check(b))

static member (+) (c1:******color, c2:******color) =

******color(c1.r + c2.r, c1.g + c2.g, c1.b + c2.b)

static member (*) (c1:******color, n) =

******color(c1.r * n, c1.g * n, c1.b * n)

static member dividebyint (c1:******color, n) =

******color(c1.r / n, c1.g / n, c1.b / n)

static member zero = ******color(0, 0, 0)

型別使用 .net 的屬性 struct 注釋,這是乙個專門屬性,用於指示 f# 編譯器把型別編譯為值型別,與之對應的 c# 關鍵字是 struct。在此示例中,使用值型別是重要的,因為我們將建立乙個這些值的陣列,並在堆上為每個畫素分配乙個新的物件,將是非常低效的。

型別提供乙個建構函式,它取顏色的紅色、綠色和藍色元件,並通過成員公開它們。注意,宣告值型別時,我們要顯式提供所有引數的型別。這些引數指定型別的字段,定義值型別的結構,因此,看到它們是很有用的。然後,型別提供乙個成員,如果他們是小於 0 或超過 255,元件的值會被剪輯。這可用於建立有效的顏色,使所有元件的值在 0-255 的範圍內。下一步,型別提供了運算子的過載,為元件按位(component-wise ) 顏色加法,和元件乘以乙個整數。

就像在 c# 中,過載的運算子實現為該型別的靜態成員。我們已經看到另一種方式在 f# 實現運算子(在第 6 章),我們用 let 繫結宣告,像函式一樣。過載的運算子是更適合的,如果運算子是這個型別的乙個固有部分。管道運算子(|>)邏輯上不屬於任何型別,而我們的運算子是專門給 ******color 的。

有些 f# 的庫函式可以處理任何提供基本運算子和成員的型別。這也是為什麼我們提供 zero 成員的原因,它返回黑顏色。當乙個型別有加號運算子和 zero 成員時,對於任何 clr,clr = clr + t.zero 應該是 true。我們可以看到,對於我們的型別,它是 true。dividebyint 成員是某些 f# 庫函式所預期的另乙個名字,馬上就會看到。它執行顏色值的整數除法。我們可以提供這種功能,比如 / 運算子,但是,/ 運算子有相同型別的運算元,更常見的,所以,如果我們想要實現除法,取兩種顏色作為其引數值,我們將會使用它。

這個型別的另乙個重要方面是不可變性。任何操作都不能修改已有的值,而是返回新的顏色(例項成員 clipcolor)。即使你不以函式風格程式設計,當你寫自己的值型別時,這仍是好的做法。在各種微妙的方式中,可變的值型別可能令人頭痛。

現在,我們已經有乙個型別,表示顏色,讓我們看看如何表示圖形濾鏡,以及如何執行它們。我們還沒有並行化這種操作,在嘗試並行化之前,寫可以正常工作的**,以順序執行,通常是值得的,同時銘記並行化。

Flash中顏色位移計算

flash中顏色位移計算 一 說明 要想獲取單個顏色的值,需要對顏色進行位移操作,為什麼要在最前面加兩個零呢?有些顏色是有透明度的,加兩個零是將透明度的值過濾掉,如果你需要透明度的值,可以通過這個獲取var a uint c 24 0xff 位移數值的說明 為什麼要位移24 16 8呢,是因為顏色是...

計算機中的顏色I 顏色概述

無論是設計網頁還是編寫程式,乙個美觀的介面是必不可少的。仔細分析介面的構成,無外乎兩個因素 一是顏色 乙個是形狀。這個又被稱為ui設計。美術功底好的人,是能設計出讓人賞心悅目的介面來,欠缺美術功底的人,有時費盡心思也沒轍。這個系列的文章,專注於計算機的顏色表示。通過了解計算機的顏色表示,能有助於提高...

計算機中的顏色V 快速計算顏色的色相值

在之前的文章中,給定乙個顏色,它的色相值計算如下 由公式可知,計算色相時要分為六種情況,計算略顯複雜。有沒有簡單的計算方法呢?來看看下面這個圖 上面這個圖,表示純色的色相分布,把純色分為六個部分。仔細觀察,每個部分的純色都有統一的特點,例如,右上角的部分,r 255,b 0,g從0變化到255。右邊...