示例#1
0
        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);
        }