Exemplo n.º 1
0
        public static string ExtractInformation(this Bitmap image, int wordLength, int significantBitsLength,
                                                AreaEmbeddingModel areaEmbedding, Matrix matrix)
        {
            var binText = Modifier.Extract(image, wordLength, significantBitsLength, areaEmbedding, matrix, null);

            return(binText.ToTextString());
        }
Exemplo n.º 2
0
        public static Bitmap ExtractInformation(this Bitmap image, int wordLength, int significantBitsLength,
                                                AreaEmbeddingModel areaEmbedding, Matrix matrix, int widthImage, int heightImage)
        {
            var countBits = widthImage * heightImage * 3 * 8;
            var binImage  = Modifier.Extract(image, wordLength, significantBitsLength, areaEmbedding, matrix, countBits);

            return(binImage.ToBitmap(widthImage, heightImage));
        }
Exemplo n.º 3
0
        protected WorkSpace FormWorkspace(Color[,] container, AreaEmbeddingModel areaEmbedding)
        {
            var rows      = container.GetLength(0);
            var columns   = container.GetLength(1);
            var workSpace = new WorkSpace();

            for (var x = 0; x < rows; x++)
            {
                for (var y = 0; y < columns; y++)
                {
                    for (var i = 0; i < 8; i++)
                    {
                        try
                        {
                            if (areaEmbedding.SignificantBits["R"][i])
                            {
                                workSpace.Significantbits += container[x, y].R.GetBit(i);
                            }

                            if (areaEmbedding.SignificantBits["G"][i])
                            {
                                workSpace.Significantbits += container[x, y].G.GetBit(i);
                            }

                            if (areaEmbedding.SignificantBits["B"][i])
                            {
                                workSpace.Significantbits += container[x, y].B.GetBit(i);
                            }

                            if (areaEmbedding.InSignificantBits["R"][i])
                            {
                                workSpace.Insignificantbits += container[x, y].R.GetBit(i);
                            }

                            if (areaEmbedding.InSignificantBits["G"][i])
                            {
                                workSpace.Insignificantbits += container[x, y].G.GetBit(i);
                            }

                            if (areaEmbedding.InSignificantBits["B"][i])
                            {
                                workSpace.Insignificantbits += container[x, y].B.GetBit(i);
                            }
                        }
                        catch (Exception ex)
                        {
                            Logger.Error("Forming Workspace failed!", ex.Message, ex.StackTrace);
                            return(null);
                        }
                    }
                }
            }

            return(workSpace);
        }
Exemplo n.º 4
0
        public Bitmap Embed(Bitmap image, int wordLength, int significantBitsLength,
                            AreaEmbeddingModel areaEmbedding, Matrix matrix, string binInformation)
        {
            var information             = binInformation.ToCompleteStringEmptyBits(significantBitsLength).ToByteArray();
            var imagePixels             = image.ToPixelsArray();
            var insignificantBitsLength = wordLength - significantBitsLength;

            return(ValidateParams(imagePixels, wordLength, significantBitsLength, areaEmbedding, matrix, information)
                ? EmbedCore(imagePixels, insignificantBitsLength, significantBitsLength, areaEmbedding, matrix,
                            information)
                : null);
        }
Exemplo n.º 5
0
        public static Bitmap EmbedInformation(this Bitmap image, int wordLength, int significantBitsLength,
                                              AreaEmbeddingModel areaEmbedding, Matrix matrix, Bitmap embeddableImage)
        {
            var bitsString = embeddableImage?.ToBitsString()?.ToCompleteStringEmptyBits(significantBitsLength);

            if (string.IsNullOrEmpty(bitsString))
            {
                Logger.Fatal("Embedding information failed! Embedding information is null or empty");
                return(null);
            }

            return(Modifier.Embed(image, wordLength, significantBitsLength, areaEmbedding, matrix, bitsString));
        }
Exemplo n.º 6
0
        public static Bitmap EmbedInformation(this Bitmap image, int wordLength, int significantBitsLength,
                                              AreaEmbeddingModel areaEmbedding, Matrix matrix, int bitsLength)
        {
            var bitsSequance = ConvertExtensions.GenerateBitsSequence(bitsLength).ToCompleteStringEmptyBits(significantBitsLength);

            if (string.IsNullOrEmpty(bitsSequance))
            {
                Logger.Fatal("Embedding information failed! Embedding information is null or empty!");
                return(null);
            }

            return(Modifier.Embed(image, wordLength, significantBitsLength, areaEmbedding, matrix, bitsSequance));
        }
Exemplo n.º 7
0
        private Bitmap EmbedCore(Color[,] imagePixels, int insignificantBitsLength, int significantBitsLength,
                                 AreaEmbeddingModel areaEmbedding, Matrix matrix, IReadOnlyList <byte> binInformation)
        {
            var countWords       = 0;
            var count            = 0;
            var changedWorkspace = new List <byte[]>();

            Logger.Info("Embed information: Input values are valid");
            //формирование рабочей области
            var workSpace = FormWorkspace(imagePixels, areaEmbedding);

            Logger.Info("Embed information: The working area of the image extracted");
            //Встраивание битовой строки в рабочую область контейнера
            while ((countWords < binInformation.Count / significantBitsLength) &&
                   (countWords * significantBitsLength <= workSpace.Significantbits.Length - significantBitsLength) &&
                   (countWords * insignificantBitsLength <= workSpace.Insignificantbits.Length - insignificantBitsLength))
            {
                //получение слова из рабочей области изображения (значимые и незначимые биты)
                var word = GetWord(workSpace, insignificantBitsLength, significantBitsLength, countWords);
                countWords++;
                //получение синдрома от слова
                var syndrom = GetSyndrom(matrix, word);
                // сложение синдрома и встраиваемой битовой строкой по модулю два
                for (var i = 0; i < significantBitsLength - 1; i++)
                {
                    syndrom[i] = (byte)((syndrom[i] + binInformation[count + i]) % 2);
                }
                count += significantBitsLength - 1;
                //получение вектора ошибки
                var vector = FindWeightErrorVector(matrix, syndrom, significantBitsLength);
                //сложение вектора ошибки со словом
                for (var i = 0; i < word.Length; i++)
                {
                    word[i] = (byte)((word[i] + vector[i]) % 2);
                }
                changedWorkspace.Add(word);
            }
            //встраивание рабочей области в контейнер
            Logger.Info("Embed information: Embedding a workspace in a container");
            var pixels = EmbedWorkspace(imagePixels, areaEmbedding, changedWorkspace, significantBitsLength);

            Logger.Info("Embed information: Information is embedded");
            return(pixels.ToBitmapImage());
        }
Exemplo n.º 8
0
        private static bool ValidateParams(Color[,] imagePixels, int wordLength, int significantBitsLength,
                                           AreaEmbeddingModel areaEmbedding, Matrix matrix, int?countBits)
        {
            if (countBits == 0)
            {
                Logger.Fatal("Extracting information failed! Input variable countBits is 0!");
                return(false);
            }

            if (imagePixels == null || imagePixels.Length == 0)
            {
                Logger.Fatal("Extracting information failed! Image container is null or empty!");
                return(false);
            }

            if (wordLength == 0)
            {
                Logger.Fatal("Extracting information failed! Word Length is null!");
                return(false);
            }

            if (significantBitsLength == 0)
            {
                Logger.Fatal("Extracting information failed! Significant Bits Length is null!");
                return(false);
            }

            if (matrix == null || matrix.Rows == 0 || matrix.Columns == 0)
            {
                Logger.Fatal("Extracting information failed! Matrix is null or empty!");
                return(false);
            }

            if (areaEmbedding.SignificantBits == null && areaEmbedding.InSignificantBits == null)
            {
                /*TODO Check dictionary on valid*/
                Logger.Fatal("Extracting information failed! Area Embedding is null or empty!");
                return(false);
            }

            return(true);
        }
Exemplo n.º 9
0
        private string ExtractCore(Color[,] imagePixels, int insignificantBitsLength, int significantBitsLength, AreaEmbeddingModel areaEmbedding,
                                   Matrix matrix, int?countBits)
        {
            Logger.Info("Extract information: Input values are valid");
            var binInformation = new StringBuilder();
            var countWords     = 0;//счетчик кодовых слов

            if (countBits == null)
            {
                countBits = imagePixels.GetLength(0) * imagePixels.GetLength(1) * 3 * 8;
            }
            //получение рабочей области
            var workSpace = FormWorkspace(imagePixels, areaEmbedding);

            Logger.Info("Extract information: The working area of the image extracted");
            //извлечение битов из кодовых слов рабочей области стегоконтейнера
            while (countWords < (countBits / significantBitsLength) &&
                   (countWords * significantBitsLength) <= (workSpace.Significantbits.Length - significantBitsLength) &&
                   (countWords * insignificantBitsLength) <= (workSpace.Insignificantbits.Length - insignificantBitsLength))
            {
                //формировани кодового слова
                var word = GetWord(workSpace, insignificantBitsLength, significantBitsLength, countWords);
                countWords++;
                var syndrom = GetSyndrom(matrix, word);
                foreach (var bit in syndrom)
                {
                    binInformation.Append(bit);
                }
            }
            Logger.Info("Extract information: Information extracted");
            return(binInformation.ToString());
        }
Exemplo n.º 10
0
        public string Extract(Bitmap image, int wordLength, int significantBitsLength, AreaEmbeddingModel areaEmbedding,
                              Matrix matrix, int?countBits)
        {
            var imagePixels             = image.ToPixelsArray();
            var insignificantBitsLength = wordLength - significantBitsLength;

            return(ValidateParams(imagePixels, wordLength, significantBitsLength, areaEmbedding, matrix, countBits)
                ? ExtractCore(imagePixels, insignificantBitsLength, significantBitsLength, areaEmbedding, matrix,
                              countBits)
                : null);
        }
Exemplo n.º 11
0
        private static Color[,] EmbedWorkspace(Color[,] container, AreaEmbeddingModel areaEmbedding, IEnumerable <byte[]> workspace, int signbitsLength)
        {
            var significantbits   = new List <byte>();
            var insignificantbits = new List <byte>();
            var width             = container.GetLength(0);
            var height            = container.GetLength(1);

            foreach (var it in workspace)
            {
                for (var i = 0; i < it.Length; i++)
                {
                    if (i >= signbitsLength - 1)
                    {
                        significantbits.Add(it[i]);
                    }
                    else
                    {
                        insignificantbits.Add(it[i]);
                    }
                }
            }

            var signCount   = 0; //счетчик значимых бит
            var insignCount = 0; //счетчик незначимых бит

            for (var x = 0; x < width; x++)
            {
                for (var y = 0; y < height; y++)
                {
                    int red   = container[x, y].R;
                    int green = container[x, y].G;
                    int blue  = container[x, y].B;
                    for (var i = 0; i < 8; i++)
                    {
                        if (areaEmbedding.SignificantBits["R"][i] && signCount < significantbits.Count)
                        {
                            red = red.SetBit(i, significantbits[signCount] == 1);
                            signCount++;
                        }
                        if (areaEmbedding.SignificantBits["G"][i] && signCount < significantbits.Count)
                        {
                            green = green.SetBit(i, significantbits[signCount] == 1);
                            signCount++;
                        }
                        if (areaEmbedding.SignificantBits["B"][i] && signCount < significantbits.Count)
                        {
                            blue = blue.SetBit(i, significantbits[signCount] == 1);
                            signCount++;
                        }
                        if (areaEmbedding.SignificantBits["R"][i] && insignCount < insignificantbits.Count)
                        {
                            red = red.SetBit(i, insignificantbits[insignCount] == 1);
                            insignCount++;
                        }
                        if (areaEmbedding.SignificantBits["G"][i] && insignCount < insignificantbits.Count)
                        {
                            green = green.SetBit(i, insignificantbits[insignCount] == 1);
                            insignCount++;
                        }
                        if (areaEmbedding.SignificantBits["B"][i] && insignCount < insignificantbits.Count)
                        {
                            blue = blue.SetBit(i, insignificantbits[insignCount] == 1);
                            insignCount++;
                        }
                    }
                    container[x, y] = Color.FromArgb(container[x, y].A, red, green, blue);
                    if (insignCount >= insignificantbits.Count && signCount >= significantbits.Count)
                    {
                        return(container);
                    }
                }
            }

            return(container);
        }