C#从图像中删除渐变背景

时间:2019-04-30 08:33:06

标签: c# image-processing bitmap gradient

我有一张图像被加载到C#中的位图中,其中包含我扫描的文档中的渐变背景。 例如,如下图所示:

我现在在C#中的目标是删除背景,以使背景变成白色。现在,我本人似乎找不到解决方法。有办法以某种方式实现这一目标吗?

谢谢。

enter image description here

2 个答案:

答案 0 :(得分:2)

这是使用LockBits的版本。

前提是如果它不是黑色,则将其更改为白色。

  1. GetPixelSetPixel的幅度会更快
  2. 它使用 pointers
  3. 处理内存中的原始数据
  4. 迭代通过每个像素
  5. 检查颜色并根据需要将其更改为白色
  6. 保存图像

注意 :显然,这会破坏任何抗锯齿和平滑效果,对于某些图像类型和其他各种问题将失败。

using (var bmp = new Bitmap(@"D:\Test.png"))
{
   var data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppPArgb);
   var white = Color.White.ToArgb();
   var black = Color.Black.ToArgb();

   try
   {
      var length = (int*)data.Scan0 + bmp.Height * bmp.Width;
      for (var p = (int*)data.Scan0; p < length; p++)
         if (*p != black) *p = white;
   }
   finally
   {
      // unlock the bitmap
      bmp.UnlockBits(data);
      bmp.Save(@"D:\Output.Bmp", ImageFormat.Bmp);
   }
}

输出

enter image description here

答案 1 :(得分:0)

如果您知道渐变色(例如,仅部分RGB颜色引起红色变化)或至少是文本的颜色(例如,如果始终为黑色),则可以遍历图像的所有像素,然后:

  1. 使用GetPixel()获取像素颜色。
  2. 检查是否为文本(黑色)。
  3. 如果是,则移至下一个像素。
  4. 如果不是,请使用SetPixel()将颜色更改为白色。

对于渐变,它应该足够了。对于更复杂的背景,则需要更复杂的算法。