示例#1
0
        private void hotpixelDenoise(Color blockColor, Color nonBlockColor,
                                     int minTolerance, ref int changedPxCt)
        {
            unsafe
            {
                mBMPD = mBMPScreen.LockBits(
                    new Rectangle(0, 0, mBMPScreen.Width, mBMPScreen.Height),
                    ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

                byte *mpCursor = (byte *)mBMPD.Scan0;

                for (int y = 0; y < Kernel.PIXLINECOUNT; y++)
                {
                    //debug
                    for (int x = 0; x < Kernel.PIXLINELEN; x++)
                    {
                        Color curPixelColor = cppGetPxColor(x, y);

                        //if is a target block and has not been checked
                        if (curPixelColor.ToArgb() == blockColor.ToArgb() &&
                            !mMapCheckedPixels.ContainsKey(NoiseProcessor.GetKey(x, y)))
                        {
                            //to find how large the block is
                            mNP.DoBlockStatistics(x, y, blockColor);

                            int[] keys = mNP.mMapCurArea.Keys.ToArray();

                            for (int i = 0; i < keys.Length; i++)
                            {
                                //keep the block in the total
                                if (mNP.mMapCurArea.Count >= minTolerance)
                                {
                                    mMapCheckedPixels.Add(keys[i], mNP.mMapCurArea[keys[i]]);
                                }
                                else //remove from bitmap
                                {
                                    NPPoint point = mNP.mMapCurArea[keys[i]];

                                    cppSetPxColor(nonBlockColor, point.x, point.y);

                                    //bmp.SetPixel(point.x, point.y, nonBlockColor);
                                    changedPxCt--;
                                }
                            }

                            mNP.ClearBlockInfo();
                        }
                    }
                }

                mMapCheckedPixels.Clear();
                mBMPScreen.UnlockBits(mBMPD);
            }
        }
示例#2
0
        public Kernel(FrameForm form)
        {
            mForm   = form;
            mScreen = mForm.GetPicBox();

            mDataBufferM  = new byte[DATALEN];
            mDataBufferA  = new byte[DATALEN];
            mDataBufferA2 = new byte[DATALEN];

            mBMPScreen = new Bitmap(640, 480, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

            mColorPriamry   = Color.FromArgb(238, 30, 255);
            mColorSecondary = Color.FromArgb(56, 47, 238);
            mColorDiff      = Color.FromArgb(255, 216, 0);

            mScreen.Image = mBMPScreen;

            mNP = new NoiseProcessor(this);
            mMapCheckedPixels = new Dictionary <int, NPPoint>();
        }
示例#3
0
        public decimal Compare()
        {
            long lineByteCount = PIXLINELEN * 2;

            int userPxCt = 0, changedPxCt = 0;

            //Stopwatch sw = new Stopwatch();
            //sw.Start();

            unsafe
            {
                mBMPD = mBMPScreen.LockBits(
                    new Rectangle(0, 0, mBMPScreen.Width, mBMPScreen.Height),
                    ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

                mpCursor = (byte *)mBMPD.Scan0;

                for (int i = 0; i < PIXLINECOUNT; i++)
                {
                    int   j2;
                    short pxM, pxA, pxA2;

                    int baseOff = i * (int)lineByteCount;
                    for (int j = 0; j < PIXLINELEN; j++)
                    {
                        j2   = j * 2;
                        pxM  = BitConverter.ToInt16(mDataBufferM, (int)(j2 + baseOff));
                        pxA  = BitConverter.ToInt16(mDataBufferA, (int)(j2 + baseOff));
                        pxA2 = BitConverter.ToInt16(mDataBufferA2, (int)(j2 + baseOff));

                        if (pxM != -1)
                        {
                            if (NoiseProcessor.ValueCompare(pxA, pxM, pxA2, 4))//diff
                            {
                                //gold
                                cppSetPxColor(mColorDiff, j, i);

                                //*mpCursor = 0;
                                //mpCursor++;
                                //*mpCursor = 216;
                                //mpCursor++;
                                //*mpCursor = 255;
                                //mpCursor++;
                                //mBMPScreen.SetPixel(j, i, mColorDiff);
                                changedPxCt++;
                            }
                            else//primary
                            {
                                //purple
                                cppSetPxColor(mColorPriamry, j, i);

                                //*mpCursor = 255;
                                //mpCursor++;
                                //*mpCursor = 30;
                                //mpCursor++;
                                //*mpCursor = 238;
                                //mpCursor++;
                                //mBMPScreen.SetPixel(j, i, mColorPriamry);
                            }

                            userPxCt++;
                        }
                        else if (pxA != -1)//secondary
                        {
                            //blue
                            cppSetPxColor(mColorSecondary, j, i);

                            //*mpCursor = 238;
                            //mpCursor++;
                            //*mpCursor = 47;
                            //mpCursor++;
                            //*mpCursor = 56;
                            //mpCursor++;
                            //mBMPScreen.SetPixel(j, i, mColorSecondary);
                        }
                        else//black
                        {
                            cppSetPxColor(Color.Black, j, i);

                            //*mpCursor = 0;
                            //mpCursor++;
                            //*mpCursor = 0;
                            //mpCursor++;
                            //*mpCursor = 0;
                            //mpCursor++;
                            //mBMPScreen.SetPixel(j, i, Color.Black);
                        }
                    }

                    mpCursor += mBMPD.Stride - PIXLINELEN3;
                }

                mBMPScreen.UnlockBits(mBMPD);
            }

            hotpixelDenoise(mColorDiff, mColorPriamry, 22, ref changedPxCt);

            //sw.Stop();
            //Console.WriteLine(sw.ElapsedMilliseconds);
            if (userPxCt != 0)
            {
                return((decimal)changedPxCt / (decimal)userPxCt);
            }
            else
            {
                return(decimal.Zero);
            }
        }