【问题标题】:C# Remove gradient background from imageC#从图像中删除渐变背景
【发布时间】:2019-04-30 08:33:05
【问题描述】:

我将一张图片加载到 C# 中的位图中,该图片具有来自我扫描的文档的渐变背景。 如下图所示:

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

提前致谢。

【问题讨论】:

标签: c# image-processing bitmap gradient


【解决方案1】:

这是一个使用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);
   }
}

输出

【讨论】:

  • 我知道这是如何工作的,所以我肯定会尝试这个。但现在我也想知道这段代码是否可以转换为例如,如果扫描文档中有一张照片,里面有多种颜色,你不知道它们是什么颜色?
  • @DLP 只要颜色不是黑色就可以,但是我认为您可以看到它是如何工作的,因此您应该能够根据其他需要对其进行修改
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多