[C#繪圖]對映像重新著色

來源:互聯網
上載者:User

標籤:

概述:

重新著色是調整映像顏色的過程。 重新著色包括:將一種顏色更改為另一種顏色,調整某種顏色相對於另一種顏色的亮度,調整所有顏色的亮度或對比,以及增加顏色的灰階。

如何:使用顏色矩陣對單色進行變換

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) 開始並應用下面的變換:

  1. 將紅色分量乘以 2。

  2. 將 0.2 添加到紅色、綠色和藍色分量中。

下面的矩陣乘法將按照列出的順序進行這對變換。

顏色矩陣的元素按照先行後列(從 0 開始)的順序進行索引。 例如,矩陣 M 的第五行第三列由 M[4][2] 表示。

5×5 單位矩陣(在下面的插圖中顯示)在對角線上為 1,在其他任何地方為 0。 如果用單位矩陣乘以顏色向量,則顏色向量不會發生改變。 形成顏色變換矩陣的一種簡便方法是從單位矩陣開始,然後進行較小的改動以產生所需的變換。

程式範例:

下面的樣本採用一個使用一種顏色 (0.2, 0.0, 0.4, 1.0) 的映像,並應用上一段中描述的變換。下面的插圖在左側顯示原來的映像,在右側顯示變換後的映像。

下面樣本中的代碼使用以下步驟進行重新著色:

  1. 初始化 ColorMatrix 對象。

  2. 建立一個 ImageAttributes 對象,並將 ColorMatrix 對象傳遞給 ImageAttributes 對象的 SetColorMatrix 方法。

  3. 將 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#繪圖]對映像重新著色

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.