C#圖像處理之一 基本概念

首先聲明,本系列筆記既“採菊東籬下”,又“悠然見南山”。是筆者在學習C#的圖像處理的過程中借鑑、引申的筆錄。歡迎訪客指正。

(原文鏈接 http://ddbiz.com/?p=123)

概念要點:

 

1. 圖像格式

爲簡單起見,筆者的學習是從 Bitmap.PixelFormat == PixelFormat.Format24bppRgb 開始的。因爲這個圖像格式採用的是24位色,每3個字節表示一個顏色,每字節分別對應R G B。

Bitmap 對象是對圖像處理的一個非常方便的封裝。如無特別說明,筆記中的所有圖像處理,都爲 Bitmap 且 Bitmap.PixelFormat=Format24bppRgb的格式。

 

2. 圖像數據 - BitmapData

BitmapData是位圖圖像的屬性封裝,可以通過

BitmapData bmpdata = Bitmap.LockBits()來獲得。

其相應的屬性列表如下:

 

BitmapData.Height, 像素高度,或叫掃描行數

BitmapData.Width, 像素寬度,或叫一個掃描行中的像素數

BitmapData.Scan0, 像素數據的起始地址,當然也是位圖數據中的第一行的開始。

BitmapData.Stride, 跨距寬度,或叫掃描寬度。MSDN的示意爲: 跨距是單行像素(一個掃描行)的寬度,舍入爲一個 4 字節的邊界。如果跨距爲正,則位圖自頂向下。如果跨距爲負,則位圖顛倒。用程序員的語言表述,就是: Stride指一個掃描行佔用的字節數。根據BMP格式的標準,Stride一定是4的倍數。比如一個 24x11 的圖像,每行的像素信息就是 24*3 = 72, 正好是4的倍數,而一副 21x11的位圖,每行像素信息爲 21*3=63, 因爲不足4的倍數,所以用1個字節來填充,這樣每行像素信息爲21*3+1=64字節,這一個字節在筆記中成爲 offset, 所以 offset = BitmapData.Stride - BitmapData.Width * 3

 

3. 圖像地址

因爲圖像處理比較複雜,比如對於一個width=100×height=100的圖像來說,所有像素的遍歷意味着要訪問100×100×3個字節,所以在圖像處理中,筆者儘量採用指針操作,以提高處理效率(感謝上帝,c#還允許我們進行指針操作)。

對於圖像中的任意一個點,如 f(x,y),其中 x 表示行數,y表示列數。用地址指針表示,就爲

 

byte* ptr = BitmapData.Scan0 + ( x * Stride ) + y * 3;

並且 RGB 可以通過 ptr[0], ptr[1], ptr[2] 來獲得

 

 

(未完待續)

(原文鏈接 http://ddbiz.com/?p=123)

發佈了143 篇原創文章 · 獲贊 0 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章