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

问题描述 投票:1回答:2

我将一个图像加载到C#中的Bitmap中,并使用我扫描的文档中的渐变背景。它的示例如下图所示:

我在C#中的目标是删除背景,以便我拥有纯白色背景。现在我自己似乎找不到办法做到这一点。有没有办法以某种方式实现这一目标?

提前致谢。

enter image description here

c# image-processing bitmap gradient
2个回答
2
投票

这是一个使用LockBits的版本。

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

  1. GetPixelSetPixel的速度会更快
  2. 它使用指针处理内存中的原始数据
  3. 遍历每个像素
  4. 检查颜色,如果需要,将其更改为白色
  5. 保存图像

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

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


0
投票

如果您知道渐变颜色(例如,只有部分RGB颜色负责红色变化)或至少是文本颜色(例如,如果它总是黑色),那么您可以遍历所有图像的像素,然后:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.