標籤:

C#圖片的簡單處理(1)—亮度調整

注意1:本文中包含代碼。為了您更好的閱讀體驗,建議使用PC網頁版查看本文章

注意2:由於王賀青編程水平所限,所有演算法均系自主研發,所以本文所有演算法絕對不是最好的演算法,但一定是實現最簡單的演算法

我們先來做一個圖片亮度的調整。

我們可以這樣理解電腦上的圖片:一個矩陣,它的每個元素都是一個表示RGB的六位十六進位數。所謂RGB,就是Red、Green、Blue——光的三原色R、G、B分別用六位中的兩位十六進位數來表示。

而圖片亮度的調整,實際上是對圖片每個像素的顏色做調整。所以我想:如果把圖片每個像素的RGB都加上相同的值,是否能實現亮度的調整?

比起Java,我更喜歡C#。Microsoft的Visual Studio的控制項讓我們可以像畫圖工具那樣在窗體上直接繪製組件,我可以把精力放在更核心的地方,不像Java,要麼嵌套一個又一個的Layout,要麼自己一個個地確定每個控制項的長高和xy坐標——反正要寫長長一段簡單枯燥的代碼。而且,Java的運行方式決定了我們沒法使用Java在妹子面前裝逼——大多數妹子不會在自己電腦上安裝Java虛擬機,也不懂得如何運行一個Java程序。而Windows在每個系統上都預裝了.net,所以C#不會遇到這個問題。

在C#中,我們通過Bitmap類來實現對每個像素的操作。我們要先在窗體上繪製一個pictureBox來存放我們要操作的圖片。然後,我們再用這個pictureBox裡面的圖片來實例化我們的Bitmap類。

Bitmap picture = new Bitmap(pictureBox1.Image);

然後我們就要遍歷圖片的每一個像素,並對它們進行操作。圖片的數據結構很簡單,就像一個二維數組一樣。我們只要兩個for循環就可以實現對它的遍歷。

在c#中,有一個專門的Color類表示顏色。我們可以用它來臨時存儲要操作的像素的顏色;我們通過Bitmap的GetPixel方法來獲得當前像素的顏色值。

Color pixColor = picture.GetPixel(x, y);

我們還可以通過設置RGB的每一位來創建一個新的顏色實例

Color newPixColor = Color.FromArgb(R, G, B);

注意:前面說過,實際上RGB是一個六位的十六進位數,R、G、B各佔兩位,所以每一位共有16*16=256個值,即0~255,剛好一個Byte。

byte R, G, B;

然後,我們給每個像素的R、G、B各加上一個確定的值changeValue。對於一個color的實例,我們可以直接獲取它的R、G、B這三個屬性。

R = (byte)(pixColor.R + changeValue); G = (byte)(pixColor.G + changeValue); B = (byte)(pixColor.B + changeValue);

但是,直接這樣寫有個問題:R、G、B的值是一個Byte類型的數據,當它們加上changeValue時,有可能超過Byte的範圍(0~255)而引發報錯。所以在賦值之前,我們應該加個判斷。

R = (0< pixColor.R + changeValue && pixColor.R + changeValue < 255) ? (byte)(pixColor.R + changeValue) : pixColor.R;G = (0< pixColor.G + changeValue && pixColor.G + changeValue < 255) ? (byte)(pixColor.G + changeValue) : pixColor.G;B = (0< pixColor.B + changeValue && pixColor.B + changeValue < 255) ? (byte)(pixColor.B + changeValue) : pixColor.B;

然後,我們再通過Bitmap的SetPixel方法把像素設置為新的顏色就可以了~~

picture.SetPixel(x, y, newPixColor);

下面是實際效果:

下面是完整代碼:

Bitmap picture = new Bitmap(pictureBox1.Image); for (short x = 0; x < picture.Width; x++) { for (short y = 0; y < picture.Height; y++) { Color pixColor = picture.GetPixel(x, y); byte R, G, B; R = (0< pixColor.R + changeValue && pixColor.R + changeValue < 255) ? (byte)(pixColor.R + changeValue) : pixColor.R; G = (0< pixColor.G + changeValue && pixColor.G + changeValue < 255) ? (byte)(pixColor.G + changeValue) : pixColor.G; B = (0< pixColor.B + changeValue && pixColor.B + changeValue < 255) ? (byte)(pixColor.B + changeValue) : pixColor.B; Color newPixColor = Color.FromArgb(R, G, B); picture.SetPixel(x, y, newPixColor); } } pictureBox1.Image = picture;

推薦閱讀:

[論文分享(一)] 水印自動去除(上)---水印的自動識別和特徵提取
6款超級少女心的p圖軟體推薦
想要照片更文藝,試試這款 APP
圖偵工作流程——北京明景科技
我的前世青年照怎麼玩?

TAG:C | 圖片處理 |