如何在C#中读取图像前景和背景中的像素总数?

时间:2014-01-27 15:43:03

标签: c# image graphic

基本上我编写了一个代码来创建一个角色的图像(随机生成)。我有一个问题,如何逐行扫描图像,并读取我的bmp图像中的前景(文本)和背景(白色)像素的总数,并将结果显示给用户。这是我的代码的一部分:

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);

1 个答案:

答案 0 :(得分: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或你所说的“这是背景”的阈值。当你想要添加实际背景 color 时,你会在一个完全白色的位图上绘制这个位图并保存它。