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); } }
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>(); }
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); } }