標籤:
概述:
重新著色是調整映像顏色的過程。 重新著色包括:將一種顏色更改為另一種顏色,調整某種顏色相對於另一種顏色的亮度,調整所有顏色的亮度或對比,以及增加顏色的灰階。
如何:使用顏色矩陣對單色進行變換
GDI+ 提供用於儲存和操作映像的 Image 和 Bitmap 類。Image 和 Bitmap 對象用一個 32 位元字儲存每個像素的顏色:紅、綠、藍和 Alpha 各 8 位。 這四個分量的值都是 0 到 255,其中 0 表示沒有亮度,255 表示最大亮度。 alpha 分量指定顏色的透明度:0 表示完全透明,255 表示完全不透明。
顏色向量採用 4 元組形式(紅色、綠色、藍色、alpha)。 例如,顏色向量 (0, 255, 0, 255) 表示一種沒有紅色和藍色但綠色達到最大亮度的不透明顏色。
表示顏色的另一種慣例是用數字 1 表示亮度達到最大。 通過使用這種約定,上一段中描述的顏色將可以由向量 (0, 1, 0, 1) 表示。 在執行顏色變換時,GDI+ 遵循使用 1 為最大亮度的慣例。
可通過用 4×4 矩陣乘以這些顏色向量將線性變換(旋轉和縮放等)應用到顏色向量中。 但是,您不能使用 4×4 矩陣進行平移(非線性)。 如果在每個顏色向量中再添加一個虛擬第 5 座標(例如,數字 1),則可使用 5×5 矩陣應用任何組合形式的線性變換和平移。 由線性變換組成的後跟平移的變換稱為仿射變換。
例如,假設您希望從顏色 (0.2, 0.0, 0.4, 1.0) 開始並應用下面的變換:
將紅色分量乘以 2。
將 0.2 添加到紅色、綠色和藍色分量中。
下面的矩陣乘法將按照列出的順序進行這對變換。
顏色矩陣的元素按照先行後列(從 0 開始)的順序進行索引。 例如,矩陣 M 的第五行第三列由 M[4][2] 表示。
5×5 單位矩陣(在下面的插圖中顯示)在對角線上為 1,在其他任何地方為 0。 如果用單位矩陣乘以顏色向量,則顏色向量不會發生改變。 形成顏色變換矩陣的一種簡便方法是從單位矩陣開始,然後進行較小的改動以產生所需的變換。
程式範例:
下面的樣本採用一個使用一種顏色 (0.2, 0.0, 0.4, 1.0) 的映像,並應用上一段中描述的變換。下面的插圖在左側顯示原來的映像,在右側顯示變換後的映像。
下面樣本中的代碼使用以下步驟進行重新著色:
初始化 ColorMatrix 對象。
建立一個 ImageAttributes 對象,並將 ColorMatrix 對象傳遞給 ImageAttributes 對象的 SetColorMatrix 方法。
將 ImageAttributes 對象傳遞給 Graphics 對象的 DrawImage 方法。
//擷取原圖和相應的屬性Image image = new Bitmap("InputColor.bmp");int width = image.Width;int height = image.Height;//初始化顏色矩陣float[][] colorMatrixElements = { new float[] {2, 0, 0, 0, 0}, new float[] {0, 1, 0, 0, 0}, new float[] {0, 0, 1, 0, 0}, new float[] {0, 0, 0 ,1 ,0}, new float[] {0.2f, 0.2f, 0.2f, 0, 1}};ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);//構造映像變換工具ImageAttributes imageAttributes = new ImageAttributes();imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);//畫圖e.Graphics.DrawImage(image, 10, 10);e.Graphics.DrawImage(image, new Rectangle(120, 10, width, height), 0, 0, width, height, GraphicsUnit,Pixel, imageAttributes);
如何:轉換映像顏色
平移是指在這四個顏色分量中的一個或多個中添加值。 下表給出表示平移的顏色矩陣項。
要平移的分量 |
矩陣項 |
紅色 |
[4][0] |
綠色 |
[4][1] |
藍色 |
[4][2] |
Alpha |
[4][3] |
程式範例:
下面的樣本從 ColorBars.bmp 檔案構造一個 Image 對象。 然後,代碼為映像中每個像素的紅色分量增加 0.75。 原來的映像繪製在變換後的映像旁邊。
下面的插圖在左側顯示原來的映像,在右側顯示變換後的映像。
https://msdn.microsoft.com/zh-cn/library/a7xw19wh(v=vs.110).aspx
http://www.cnblogs.com/JohnShao/archive/2011/06/08/2075070.html
http://www.cnblogs.com/yiyiruohan/archive/2010/08/24/1807533.html
[C#繪圖]對映像重新著色