Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查C中的图像是否为空#_C#_Image_Pixel - Fatal编程技术网

C# 检查C中的图像是否为空#

C# 检查C中的图像是否为空#,c#,image,pixel,C#,Image,Pixel,我到处都找过了,但似乎没有一个标准(我可以看到)来说明如何检查图像是否是空白的。在C中# 我有办法做到这一点,但我想知道什么是检查图像是否空白的正确方法,这样将来每个人都可以知道 我不打算复制粘贴一堆代码,如果你愿意的话,这将是我的荣幸,但我只想首先解释一下如何检查图像是否为空白 拍摄一张.jpg图像,获取其宽度。例如500像素 然后除以2 给你250 然后检查(250宽,i高)位置的每个像素的颜色(迭代图像的高度) 这只是检查一个图像的中线,垂直的。它会检查所有的像素,看看颜色是否是白色的。我

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

我有办法做到这一点,但我想知道什么是检查图像是否空白的正确方法,这样将来每个人都可以知道

我不打算复制粘贴一堆代码,如果你愿意的话,这将是我的荣幸,但我只想首先解释一下如何检查图像是否为空白

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

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

这只是检查一个图像的中线,垂直的。它会检查所有的像素,看看颜色是否是白色的。我已经这样做了,所以你不必搜索所有500个像素的高度,因为你几乎总是在页面中间碰到一个颜色。

它的工作…有点慢…一定有更好的方法来做到这一点?你可以将它改为垂直搜索2/3/4行,以增加你发现一个不是空白的页面的机会,但这将花费更长的时间

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

添加溶液后。

用于帮助实施和理解解决方案的资源

(请注意,在第一个网站上,声明的Pizelformat实际上是Pixelformat)-我知道的一个小错误,仅仅提及一下,可能会给一些人带来一些混乱

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

对于40幅图像,旧时间=15.63

对于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;
        }
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,则可以大大加快速度,作者:

  • 不使用GetPixel访问像素,请使用锁定位和解锁位将图像位图复制到常规内存。有关用法,请参阅上的示例
  • 不在for循环中调用宽度、高度或大小属性。只调用一次大小,将值存储在局部变量中,然后在循环中使用这些值
  • 注:

  • 使用System.Drawing.Bitmap时,您的图像可能位于设备内存中,访问它可能很耗时
  • 我不记得将图像加载到位图中是否已经将其转换为RGB格式,因为其他格式更难使用,但如果不是这样,您可以创建与原始图像大小相同的RGB位图,获取其图形对象(Graphics.FromImage)并使用DrawImage在RGB位图中绘制原始图像
  • 编辑:按DocMax的打孔


    在任何情况下,为了提高速度,您也可以尝试使用其他库,例如包含C#wrappers的优秀库。

    将图像缩放到1x1,然后检查一个像素


    新位图(以前的图像,新大小(1,1))

    你计算过需要多长时间吗?如果是的话,时间是多少,图像的高度是多少?你的实现一定出了问题,因为你的算法在我看来是合理的。扫描位图的一列应该根本不需要时间。32个图像的总时间=00:00:12.9187389高度=6552宽度=4580b可能有吗一些外部因素在起作用?电脑速度等?如果你能发布你的整个测试代码,我们可能会发现一些东西。根据经验,使用锁位读取600x800图像中的所有像素根本不需要时间(如果是毫秒)你真的很正确,我正在使用Bitmap.GetPixel。谢谢你,我会检查这个解决方案,然后将我的发现发布在这里,这样就有了一个完整的解决方案和关于如何检查图像的“敢说”标准。所以我实现了这个解决方案。唯一的问题是