public static Bitmap ReturnDifferences(UnlockedBitmap unlockedA, UnlockedBitmap unlockedB)
        {
            Bitmap   result = new Bitmap(unlockedA.Bitmap.Width, unlockedA.Bitmap.Height, PixelFormat.Format32bppArgb);
            Graphics g      = BitmapFactory.CreateGraphics(result);

            g.Clear(Color.Transparent);
            g.Dispose();
            var unlockedRes = Unlock(result);
            int npixels     = unlockedA.Bitmap.Height * unlockedA.Data.Stride / 3;

            unsafe
            {
                byte *pA   = (byte *)unlockedA.Data.Scan0.ToPointer();
                byte *pB   = (byte *)unlockedB.Data.Scan0.ToPointer();
                int * pRes = (int *)unlockedRes.Data.Scan0.ToPointer();

                for (int i = 0; i < npixels; i++)
                {
                    if (pA[0] != pB[0] || pA[1] != pB[1] || pA[2] != pB[2])
                    {
                        pRes[i] = Color.Red.ToArgb();
                    }

                    pA += 3;
                    pB += 3;
                }
            }

            Lock(unlockedRes);
            return(result);
        }
 public static void Lock(UnlockedBitmap unlockedBmp, bool dispose = false)
 {
     unlockedBmp.Bitmap.UnlockBits(unlockedBmp.Data);
     if (dispose)
     {
         unlockedBmp.Bitmap.Dispose();
     }
 }
        public static bool ContainsDifferences(UnlockedBitmap unlockedA, Bitmap b, bool disposeIfNoDifferences = false)
        {
            bool hasDif;
            var  unlockedB = Unlock(b);

            hasDif = ContainsDifferences(unlockedA, unlockedB);

            Lock(unlockedB, !hasDif && disposeIfNoDifferences);
            return(hasDif);
        }
        public static Bitmap ReturnDifferences(UnlockedBitmap unlockedA, Bitmap b, bool dispose = false)
        {
            Bitmap result;
            var    unlockedB = Unlock(b);

            result = ReturnDifferences(unlockedA, unlockedB);

            Lock(unlockedB, dispose);
            return(result);
        }
        public static bool ContainsDifferences(UnlockedBitmap unlockedA, UnlockedBitmap unlockedB)
        {
            int npixels = unlockedA.Bitmap.Height * unlockedA.Data.Stride / 3;

            unsafe {
                byte *pA = (byte *)unlockedA.Data.Scan0.ToPointer();
                byte *pB = (byte *)unlockedB.Data.Scan0.ToPointer();

                for (int i = 0; i < npixels; i++)
                {
                    if (pA[0] != pB[0] || pA[1] != pB[1] || pA[2] != pB[2])
                    {
                        return(true);
                    }

                    pA += 3;
                    pB += 3;
                }
            }
            return(false);
        }
 public static void Dispose(UnlockedBitmap unlockedBmp)
 {
     unlockedBmp.Bitmap.Dispose();
 }