2014-01-27 33 views
0

基本上我寫了一個代碼來創建一個字符的圖像(隨機生成)。我有一個問題,如何逐行掃描圖像,並讀取我的bmp圖像中前景(文本)和背景(白色)像素的總數,並將結果顯示給用戶。這裏是我的代碼部分:如何在C#中讀取圖像前景和背景中的像素總數?

Image bmp = new Bitmap(100, 100); 
Graphics g = Graphics.FromImage(bmp); 
g.Clear(Color.White); 
g.DrawString(randomString, myFont, new SolidBrush(Color.Black), new PointF(0, 0)); 
pictureBox1.Image = bmp; 
bmp.Save(@"CAPTCHA.bmp", System.Drawing.Imaging.ImageFormat.Bmp); 
+0

哪部分需要幫助?掃描?數數?確定一個像素是背景還是前景? – Gabe

+0

我假設白色是背景,任何其他顏色是前景。我需要掃描圖像的所有部分,並計算每行中的所有像素以及整個圖像。 ;) – CowBoy

回答

2

基本的想法很簡單 - 遍歷所有像素的位圖,如果像素爲白色,增加你的背景像素計數器。完成後,您可以簡單地獲取像素總數(寬度*高度),並根據背景像素計數器值執行任何您想要的操作。

一個簡單的(並且很慢)的代碼段,這是否:

var backgroundPixels = 0; 

for (int x = 0; x < bmp.Width; x++) 
    for (int y = 0; y < bmp.Height; y++) 
    if (bmp.GetPixel(x, y) == Color.White) 
     backgroundPixels++; 

前景和背景的概念是隻存在在你的頭上。得到的位圖只有一個像素數組,每個像素都有一個位置和顏色。你可以給某種顏色指定一個特定的含義(在你的案例中是白色),並說它是指背景 - 但就是這樣。

一個很好的選擇是使用一個透明的位圖,其中對於你所說的背景 - 透明度確實有特殊的含義。在這種情況下,除了顏色外,像素還具有透明度(Color.A)的概念,您可以利用該概念。在這種情況下,您應該使用g.Clear(Color.Transparent);而不是使用白色,並且在迭代像素時,您會檢查是否bmp.GetPixel(x, y).A > 0或您要說「這是背景」的任何閾值。當你想添加實際背景顏色時,你可以將這個位圖繪製成完全白色的位圖並保存。

+0

謝謝你的代碼。 (x,y)表示一行中的x或列中的y?或者意味着如果兩個像素都是白色,同時將「背景像素」增加1? – CowBoy

+0

這基本上是爲了計算背景中的總像素,我應該如何在同一時間獲取圖像中字符的總像素(我的前景)? – CowBoy

+0

Luaan:它給我錯誤的「GetPixel」引用錯誤。我應該包括任何參考? – CowBoy