public static Bitmap EmbedImage(string visibleImageFilename, string hiddenImageFilename)
        {
            Bitmap visibleImage = new Bitmap(visibleImageFilename);
            Bitmap hiddenImage  = new Bitmap(hiddenImageFilename);

            // TODO: don't need to resize to a half if hidden image is less than a half
            hiddenImage = ImageResizer.CropAndResizeBitmap(visibleImage.Size, hiddenImage, 0.5);
            Bitmap stegImage = new Bitmap(visibleImage.Width, visibleImage.Height);

            PixelMapper pixelMapper = new PixelMapper(visibleImage.Size, hiddenImage.Size);

            foreach (PixelMap pm in pixelMapper.GetHiddenToVisiblePixelMapEnumerator())
            {
                foreach (PixelBitsMap pbm in pm.VisibleImagePoints)
                {
                    BitArray r = copyChannel(visibleImage, hiddenImage, pm.HiddenImagePoint, pbm, Channel.R);
                    BitArray g = copyChannel(visibleImage, hiddenImage, pm.HiddenImagePoint, pbm, Channel.G);
                    BitArray b = copyChannel(visibleImage, hiddenImage, pm.HiddenImagePoint, pbm, Channel.B);

                    Color pixelColor = Color.FromArgb(r.ToInt(), g.ToInt(), b.ToInt());

                    stegImage.SetPixel(pbm.Point.X, pbm.Point.Y, pixelColor);
                }
            }

            return(stegImage);
        }