我到处看看,但似乎没有一个标准(我可以看到)如何去检查以查看图像是否为空。在C#检查图像是否在C空白#
我有办法做到这一点,但很想知道检查图像是否为空的正确方法是什么,所以大家也可以在将来知道。
我不会复制粘贴一堆代码,如果你想要我,这将是我的荣幸,但我只是首先想解释我如何去检查以查看图像是否为空。
您拍摄一张.jpg图像,获取它的宽度。例如500个像素 然后,你除以2 给你250
然后,你检查什么每个像素的颜色是在的位置(250宽度,以及i高度)(其中,你迭代想到了的HIGHT图像
这样做只是检查图像像素的中间线,垂直。检查所有像素检查颜色是否是任何东西除了白色我已经这样做了,所以你不会有搜索所有500 *像素的高度,因为你几乎总是会遇到页面中间的颜色。
它的工作...有点慢...必须有一个更好的方法来做到这一点?您可以将其更改为垂直搜索2/3/4行以增加发现非空白页面的机会,但这需要更长的时间。
(另请注意,使用图像的大小,以检查其中是否包含一些不会在这种情况下工作,因为有两个句子和一个空白页面的大小在页面过于接近彼此)
解决方案添加完成后。
帮助实施和理解解决方案的资源。
- Writing unsafe code - pointers in C
- Using Pointers in C#
- /unsafe (C# Compiler Options)
- Bitmap.LockBits Method (Rectangle, ImageLockMode, PixelFormat)
(注意,第一个网站上,所陈述的Pizelformat实际上是像素格式) - 小的错误,我知道,只是提的是,可能对一些人造成一些混淆。
在我实现了加速像素搜索的方法后,速度没有那么大。所以我会认为我做错了什么。
40个图像的旧时间= 15.63。
新时间= 15.43的40张图片
我与伟大的文章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;
}
你计时了多长时间?如果是这样,什么时候,图像的高度是多少? – 3aw5TZetdf
你的执行过程中你必须做错某些事情,因为你的算法对我来说听起来很合理。应该不花时间扫描一列位图。 –
32个图像的总时间= 00:00:12.9187389 高度= 6552 宽度= 4580 – Ruan