コード例 #1
0
        private RGBdata ProcessBitmap(Bitmap a)
        {
            BitmapData bmpData = a.LockBits(new Rectangle(0, 0, a.Width, a.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            IntPtr     ptr     = bmpData.Scan0;
            RGBdata    data    = new RGBdata();

            unsafe
            {
                byte *p      = (byte *)(void *)ptr;
                int   offset = bmpData.Stride - a.Width * 3;
                int   width  = a.Width * 3;

                for (int y = 0; y < a.Height; ++y)
                {
                    for (int x = 0; x < width; ++x)
                    {
                        data.r += p[0];                 //gets red values
                        data.g += p[1];                 //gets green values
                        data.b += p[2];                 //gets blue values
                        ++p;
                    }
                    p += offset;
                }
            }
            a.UnlockBits(bmpData);
            return(data);
        }
コード例 #2
0
        public double GetSimilarity(Bitmap a, Bitmap b)
        {
            RGBdata dataA    = ProcessBitmap(a);
            RGBdata dataB    = ProcessBitmap(b);
            double  result   = 0;
            int     averageA = 0;
            int     averageB = 0;
            int     maxA     = 0;
            int     maxB     = 0;

            maxA = ((a.Width * 3) * a.Height);
            maxB = ((b.Width * 3) * b.Height);

            switch (dataA.GetLargest())                //Find dominant color to compare
            {
            case 1:
            {
                averageA = Math.Abs(dataA.r / maxA);
                averageB = Math.Abs(dataB.r / maxB);
                result   = (averageA - averageB) / 2;
                break;
            }

            case 2:
            {
                averageA = Math.Abs(dataA.g / maxA);
                averageB = Math.Abs(dataB.g / maxB);
                result   = (averageA - averageB) / 2;
                break;
            }

            case 3:
            {
                averageA = Math.Abs(dataA.b / maxA);
                averageB = Math.Abs(dataB.b / maxB);
                result   = (averageA - averageB) / 2;
                break;
            }
            }

            result = Math.Abs((result + 100) / 100);

            if (result > 1.0)
            {
                result -= 1.0;
            }

            return(result);
        }
コード例 #3
0
ファイル: _BitmapCompare.cs プロジェクト: kiri11/DrawTogether
        private RGBdata ProcessBitmap(Bitmap a)
        {
            BitmapData bmpData = a.LockBits(new Rectangle(0, 0, a.Width, a.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            IntPtr ptr = bmpData.Scan0;
            RGBdata data = new RGBdata();

            unsafe
            {
                byte* p = (byte*)(void*)ptr;
                int offset = bmpData.Stride - a.Width * 3;
                int width = a.Width * 3;

                for (int y = 0; y < a.Height; ++y)
                {
                    for (int x = 0; x < width; ++x)
                    {
                        data.r += p[0];             //gets red values
                        data.g += p[1];             //gets green values
                        data.b += p[2];             //gets blue values
                        ++p;
                    }
                    p += offset;
                }
            }
            a.UnlockBits(bmpData);
            return data;
        }