C# 检查C中的图像是否为空#
我到处都找过了,但似乎没有一个标准(我可以看到)来说明如何检查图像是否是空白的。在C中# 我有办法做到这一点,但我想知道什么是检查图像是否空白的正确方法,这样将来每个人都可以知道 我不打算复制粘贴一堆代码,如果你愿意的话,这将是我的荣幸,但我只想首先解释一下如何检查图像是否为空白 拍摄一张.jpg图像,获取其宽度。例如500像素 然后除以2 给你250 然后检查(250宽,i高)位置的每个像素的颜色(迭代图像的高度)C# 检查C中的图像是否为空#,c#,image,pixel,C#,Image,Pixel,我到处都找过了,但似乎没有一个标准(我可以看到)来说明如何检查图像是否是空白的。在C中# 我有办法做到这一点,但我想知道什么是检查图像是否空白的正确方法,这样将来每个人都可以知道 我不打算复制粘贴一堆代码,如果你愿意的话,这将是我的荣幸,但我只想首先解释一下如何检查图像是否为空白 拍摄一张.jpg图像,获取其宽度。例如500像素 然后除以2 给你250 然后检查(250宽,i高)位置的每个像素的颜色(迭代图像的高度) 这只是检查一个图像的中线,垂直的。它会检查所有的像素,看看颜色是否是白色的。我
这只是检查一个图像的中线,垂直的。它会检查所有的像素,看看颜色是否是白色的。我已经这样做了,所以你不必搜索所有500个像素的高度,因为你几乎总是在页面中间碰到一个颜色。
它的工作…有点慢…一定有更好的方法来做到这一点?你可以将它改为垂直搜索2/3/4行,以增加你发现一个不是空白的页面的机会,但这将花费更长的时间 (还要注意,在这种情况下,使用图像的大小检查它是否包含某些内容是不起作用的,因为一个有两个句子的页面和一个空白页面的大小彼此太接近了) 添加溶液后。 用于帮助实施和理解解决方案的资源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;
}
private不安全int getPixelData2(位图bm)
{
BitmapData bmd=bm.LockBits(新的System.Drawing.Rectangle((bm.Width/2)、0、1、bm.Height)、System.Drawing.ImageLockMode.ReadOnly、bm.PixelFormat);
蓝色;
绿色;
红色;
内部宽度=骨密度宽度/2;
对于(int y=0;y
如果你能容忍出错的可能性,那么这种方法似乎很好;我在我的案例中也做了类似的事情,尽管我总是有视觉确认来处理错误
对于性能,关键的开放性问题是您如何获得要测试的像素。如果您正在使用,您肯定会遇到性能问题。(在Google中搜索“”以查看大量讨论。)
一次获取所有像素,然后在其上循环,将获得更好的性能。我个人喜欢清晰度和完整性。通过这种方法,根据您的性能需要,检查所有像素可能是合理的。如果您使用System.Drawing.Bitmap,则可以大大加快速度,作者:
在任何情况下,为了提高速度,您也可以尝试使用其他库,例如包含C#wrappers的优秀库。将图像缩放到1x1,然后检查一个像素
新位图(以前的图像,新大小(1,1))你计算过需要多长时间吗?如果是的话,时间是多少,图像的高度是多少?你的实现一定出了问题,因为你的算法在我看来是合理的。扫描位图的一列应该根本不需要时间。32个图像的总时间=00:00:12.9187389高度=6552宽度=4580b可能有吗一些外部因素在起作用?电脑速度等?如果你能发布你的整个测试代码,我们可能会发现一些东西。根据经验,使用锁位读取600x800图像中的所有像素根本不需要时间(如果是毫秒)你真的很正确,我正在使用Bitmap.GetPixel。谢谢你,我会检查这个解决方案,然后将我的发现发布在这里,这样就有了一个完整的解决方案和关于如何检查图像的“敢说”标准。所以我实现了这个解决方案。唯一的问题是