gpt4 book ai didi

c# - 在 C# 中检查图像是否为空白

转载 作者:太空狗 更新时间:2023-10-29 20:10:45 24 4
gpt4 key购买 nike

我到处都看过,但似乎没有一个标准(我可以看到)如何检查图像是否为空白。在 C# 中

我有办法做到这一点,但很想知道检查图像是否为空白的正确方法是什么,以便将来每个人也能知道。

我不会复制粘贴一堆代码,如果你想让我这样做,我会很高兴,但我首先想解释一下我如何检查图像是否为空白。

你拍摄一张 .jpg 图像,获取它的宽度。例如 500 像素然后除以 2给你250

然后你检查每个像素的颜色在(250 宽度,和 i 高度)的位置(你迭代认为图像的高度。

接下来要做的只是垂直检查图像的中间像素线。它遍历所有像素,检查颜色是否为白色以外的任何颜色。我这样做是为了让您不必搜索所有 500* 像素的高度,因为您几乎总是会在页面中间遇到一种颜色。

它的工作...有点慢...必须有更好的方法来做到这一点?您可以将其更改为垂直搜索 2/3/4 行,以增加发现非空白页面的机会,但这需要更长的时间。

(另请注意,在这种情况下,使用图像的大小来检查它是否包含某些内容将不起作用,因为包含两个句子的页面和空白页面的大小彼此太接近了)

添加解决方案后。

有助于实现和理解解决方案的资源。

(请注意,在第一个网站上,声明的 Pizelformat 实际上是 Pixelformat)- 我知道的小错误,只是提一下,可能会让一些人感到困惑。

我实现了加快像素搜索的方法后,速度并没有增加多少。所以我会认为我做错了什么。

40 张图像的旧时间 = 15.63。

40 张图片的新时间 = 15.43

我看到了很棒的文章 DocMax quoted ,代码“锁定”在一组像素中。 (或者我就是这么理解的)所以我所做的是锁定每页中间的像素行。这是正确的做法吗?

private int testPixels(String sourceDir)
{
//iterate through images
string[] fileEntries = Directory.GetFiles(sourceDir).Where(x => x.Contains("JPG")).ToArray();

var q = from string x in Directory.GetFiles(sourceDir)
where x.ToLower().EndsWith(".jpg")
select new FileInfo(x);

int holder = 1;
foreach (var z in q)
{
Bitmap mybm= Bitmap.FromFile(z.FullName) as Bitmap;
int blank = getPixelData2(mybm);

if (blank == 0)
{
holder = 0;
break;
}
}
return holder;
}

然后是类

private unsafe int getPixelData2(Bitmap bm)
{
BitmapData bmd = bm.LockBits(new System.Drawing.Rectangle((bm.Width / 2), 0, 1, bm.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bm.PixelFormat);

int blue;
int green;
int red;

int width = bmd.Width / 2;
for (int y = 0; y < bmd.Height; y++)
{
byte* row = (byte*)bmd.Scan0 + (y * bmd.Stride);

blue = row[width * 3];
green = row[width * 2];
red = row[width * 1];

// Console.WriteLine("Blue= " + blue + " Green= " + green + " Red= " + red);
//Check to see if there is some form of color
if ((blue != 255) || (green != 255) || (red != 255))
{
bm.Dispose();
return 1;
}
}
bm.Dispose();
return 0;
}

最佳答案

如果您可以容忍出错的可能性,那么该方法似乎不错;在我的案例中,我做了一些非常相似的事情,尽管我总是有一个视觉确认来处理错误。

对于性能,关键的开放性问题是如何获得要测试的像素。如果您使用 Bitmap.GetPixel ,你肯定会遇到性能问题。 (在 Google 中搜索“Bitmap.GetPixel slow”可以看到很多讨论。)

更好的性能将来自一次获取所有像素然后循环遍历它们。我个人喜欢Bob Powell's LockBits discussion为了清楚和完整。使用这种方法,根据您的性能需求检查所有像素可能是合理的。

关于c# - 在 C# 中检查图像是否为空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12684885/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com