3

我有这个来自stackoverflow答案的代码来检测明亮和黑暗的图像

问题是它不起作用,我不知道为什么。

例如,如果我打电话

IsDark(bitmap, 40, 0.9); // this always sees the image as bright

0.1 到 0.99 之间的任何值都会返回明亮的图像,而大于 0.99 的任何其他值都会将所有图像都返回为暗的。

即使从 1 设置为 250,公差值似乎也没有效果。

 // For fast access to pixels        
    public static unsafe byte[] BitmapToByteArray(Bitmap bitmap)
    {
        BitmapData bmd = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly,
                                         PixelFormat.Format32bppArgb);
        byte[] bytes = new byte[bmd.Height * bmd.Stride];
        byte* pnt = (byte*)bmd.Scan0;
        Marshal.Copy((IntPtr)pnt, bytes, 0, bmd.Height * bmd.Stride);
        bitmap.UnlockBits(bmd);
        return bytes;
    }

    public bool IsDark(Bitmap bitmap, byte tolerance, double darkProcent)
    {
        byte[] bytes = BitmapToByteArray(bitmap);
        int count = 0, all = bitmap.Width * bitmap.Height;
        for (int i = 0; i < bytes.Length; i += 4)
        {
            byte r = bytes[i + 2], g = bytes[i + 1], b = bytes[i];
            byte brightness = (byte)Math.Round((0.299 * r + 0.5876 * g + 0.114 * b));
            if (brightness <= tolerance)
                count++;
        }
        return (1d * count / all) <= darkProcent;
    }
4

1 回答 1

4

好的,再看一遍,我注意到函数末尾的比较是向后看的(基于变量“darkProcent”的名称)。我认为比较运算符应该是>=,而不是<=。

这让我得到了我对测试图像所期望的答案。

于 2013-07-18T16:54:22.343 回答