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); }
public static Bitmap ExtractHiddenImage(string stegImageFilename) { Bitmap stegImage = new Bitmap(stegImageFilename); Bitmap hiddenImage = new Bitmap(stegImage.Size.Width / 2, stegImage.Size.Height / 2); PixelMapper pixelMapper = new PixelMapper(stegImage.Size, hiddenImage.Size); foreach (PixelMap pm in pixelMapper.GetHiddenToVisiblePixelMapEnumerator()) { BitArray r = extractChannel(stegImage, hiddenImage, pm, Channel.R); BitArray g = extractChannel(stegImage, hiddenImage, pm, Channel.G); BitArray b = extractChannel(stegImage, hiddenImage, pm, Channel.B); Color pixelColor = Color.FromArgb(r.ToInt(), g.ToInt(), b.ToInt()); hiddenImage.SetPixel(pm.HiddenImagePoint.X, pm.HiddenImagePoint.Y, pixelColor); } return(hiddenImage); }