我已经到处查找,但似乎没有一个标准(我能看到的)来检查图像是否为空。在C#中,我有一种方法可以做到这一点,但我很想知道正确的方法是什么,这样每个人将来也会知道。我不打算复制粘贴一堆代码,如果你想让我这样做,我很愿意,但我首先想解释一下如何检查图像是否为空。您需要获取.jpg图像的宽度,例如500像素,然后将其除以2,得到250。然后,您检查位于(250宽度和i高度)位置的每个像素的颜色(其中您遍历图像的高度)。这样做只会垂直地检查图像的中间行像素。它遍历所有像素,检查颜色是否为除白色以外的任何颜色。我这样做是为了避免搜索所有500*height像素,因为您几乎总是会遇到页面中央的颜色。
它正在工作……有点慢……一定有更好的方法吧?您可以将其更改为垂直搜索2/3/4行,以增加发现非空白页面的机会,但这将需要更长时间。
(还要注意,使用图像大小来检查是否包含某些内容在这种情况下不起作用,因为具有两个句子和空白页的大小相近)
解决方案添加后。
资源可帮助实施和理解解决方案。
它正在工作……有点慢……一定有更好的方法吧?您可以将其更改为垂直搜索2/3/4行,以增加发现非空白页面的机会,但这将需要更长时间。
(还要注意,使用图像大小来检查是否包含某些内容在这种情况下不起作用,因为具有两个句子和空白页的大小相近)
解决方案添加后。
资源可帮助实施和理解解决方案。
(请注意,在第一个网站上,所述的Pizelformat实际上是Pixelformat)-我知道这是一个小错误,只是提一下,可能会对某些人造成困惑。
在我实现了加速像素搜索的方法后,速度并没有增加太多。所以我认为我做错了什么。
旧时间= 15.63,用于40张图片。
新时间= 40张图像的15.43秒 我在DocMax的伟大文章引用中看到,代码会“锁定”一组像素。(或者这就是我的理解) 所以我锁定了每个页面的中间行像素。这样做是否正确?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;
}