public override Bitmap RecoverWatermark(Bitmap watermarkedImage) { var coverData = ImageUtility.ConvertToMatrix(_coverImage); var watermarkData = ImageUtility.ConvertToMatrix(_watermark); var watermarkedData = ImageUtility.ConvertToMatrix(watermarkedImage); Action red = () => RecoverChannel(coverData.R, watermarkedData.R, watermarkData.R); Action green = () => RecoverChannel(coverData.G, watermarkedData.G, watermarkData.G); Action blue = () => RecoverChannel(coverData.B, watermarkedData.B, watermarkData.B); Parallel.Invoke(red, green, blue); var avgGray = new double[watermarkData.Width, watermarkData.Height]; for (int i = 0; i < watermarkData.Width; i++) { for (int j = 0; j < watermarkData.Height; j++) { avgGray[i, j] = (1 * watermarkData.R[i, j] + 1 * watermarkData.G[i, j] + 1 * watermarkData.B[i, j]) / 3; } } watermarkData = new RgbData(avgGray); var recoveredWatermark = ImageUtility.ConvertToBitmap(watermarkData); return(recoveredWatermark); }
public static Bitmap ConvertToBitmap(RgbData data) { Bitmap bmp = new Bitmap(data.Width, data.Height); double[,] Red = ScalePixels(data.R); double[,] Green = ScalePixels(data.G); double[,] Blue = ScalePixels(data.B); for (int i = 0; i < data.Width; i++) { for (int j = 0; j < data.Height; j++) { Color c = Color.FromArgb((int)Red[i, j], (int)Green[i, j], (int)Blue[i, j]); bmp.SetPixel(i, j, c); } } return(bmp); }