C# 从图像中删除渐变背景
C# Remove gradient background from image
我将一张图像加载到 C# 中的位图中,该图像具有来自我扫描的文档的渐变背景。
它的一个例子可能如下图所示:
我现在在 C# 中的目标是删除背景,以便我拥有纯白色背景。现在我自己似乎找不到办法做到这一点。有没有办法以某种方式实现这一目标?
提前致谢。
如果您知道渐变颜色(例如,只有部分 RGB 颜色负责红色变化)或至少知道文本的颜色(例如,如果它始终为黑色),那么您可以遍历图像的所有像素,然后:
- 使用
GetPixel()
获取像素颜色。
- 检查是否为文本(黑色)。
- 如果是,则移动到下一个像素。
- 如果不是,则使用
SetPixel()
将颜色更改为白色。
对于渐变,它应该足够了。对于更复杂的背景,它需要更复杂的算法。
这是使用 LockBits
的版本。
前提是不是黑色就改成白色
- 它会比
GetPixel
和 SetPixel
快几个数量级
- 它使用指针
处理内存中的原始数据
- 迭代每个像素
- 检查 颜色 并根据需要将其更改为白色
- 保存图片
注意:显然这会破坏任何抗锯齿和平滑处理,某些图像类型会失败,以及其他各种问题。
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);
}
}
输出
我将一张图像加载到 C# 中的位图中,该图像具有来自我扫描的文档的渐变背景。 它的一个例子可能如下图所示:
我现在在 C# 中的目标是删除背景,以便我拥有纯白色背景。现在我自己似乎找不到办法做到这一点。有没有办法以某种方式实现这一目标?
提前致谢。
如果您知道渐变颜色(例如,只有部分 RGB 颜色负责红色变化)或至少知道文本的颜色(例如,如果它始终为黑色),那么您可以遍历图像的所有像素,然后:
- 使用
GetPixel()
获取像素颜色。 - 检查是否为文本(黑色)。
- 如果是,则移动到下一个像素。
- 如果不是,则使用
SetPixel()
将颜色更改为白色。
对于渐变,它应该足够了。对于更复杂的背景,它需要更复杂的算法。
这是使用 LockBits
的版本。
前提是不是黑色就改成白色
- 它会比
GetPixel
和SetPixel
快几个数量级
- 它使用指针 处理内存中的原始数据
- 迭代每个像素
- 检查 颜色 并根据需要将其更改为白色
- 保存图片
注意:显然这会破坏任何抗锯齿和平滑处理,某些图像类型会失败,以及其他各种问题。
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);
}
}
输出