public unsafe void Save(string filename)
        {
            using (var bitmap = new Bitmap(Width, Height, PixelFormat.Format32bppArgb)) {
                var bitmapData = bitmap.LockBits(
                    new Rectangle(0, 0, bitmap.Width, bitmap.Height),
                    ImageLockMode.WriteOnly,
                    PixelFormat.Format32bppArgb);

                try {
                    byte *pDestRow   = (byte *)bitmapData.Scan0;
                    int   indexFrame = 0;
                    for (int y = 0; y < Height; ++y)
                    {
                        PixelArgb *pPixel = (PixelArgb *)pDestRow;
                        for (int x = 0; x < Width; ++x)
                        {
                            pPixel->R = Data [indexFrame].R;
                            pPixel->G = Data [indexFrame].G;
                            pPixel->B = Data [indexFrame].B;
                            pPixel->A = Data [indexFrame].A;

                            indexFrame++;
                            pPixel++;
                        }
                        pDestRow += bitmapData.Stride;
                    }
                } finally {
                    bitmap.UnlockBits(bitmapData);
                }

                bitmap.Save(filename);
            }
        }
        public static unsafe FramePixelData FromFile(string filename)
        {
            using (Bitmap bitmap = (Bitmap)Bitmap.FromFile(filename)) {
                var frame = new FramePixelData(bitmap.Width, bitmap.Height);

                var bitmapData = bitmap.LockBits(
                    new Rectangle(0, 0, bitmap.Width, bitmap.Height),
                    ImageLockMode.ReadOnly,
                    PixelFormat.Format32bppArgb);
                try {
                    byte *pSourceRow = (byte *)bitmapData.Scan0;
                    int   indexFrame = 0;
                    for (int y = 0; y < frame.Height; ++y)
                    {
                        PixelArgb *pPixel = (PixelArgb *)pSourceRow;
                        for (int x = 0; x < frame.Width; ++x)
                        {
                            frame.Data [indexFrame] = new Microsoft.Xna.Framework.Color(
                                pPixel->R, pPixel->G, pPixel->B, pPixel->A);

                            indexFrame++;
                            pPixel++;
                        }
                        pSourceRow += bitmapData.Stride;
                    }
                } finally {
                    bitmap.UnlockBits(bitmapData);
                }
                return(frame);
            }
        }
 public unsafe int Delta(PixelArgb *other)
 {
     return
         (Math.Abs(B - other->B) +
          Math.Abs(G - other->G) +
          Math.Abs(R - other->R) +
          Math.Abs(A - other->A));
 }