public DifferencesExpansionConfiguraitonDialogBox(DifferencesExpansionConfiguration standardDEConfig,
                                                          DifferenceExpansionBruteForceConfiguration bruteForceDEConfig,
                                                          AlgorithmConfiguration currentConfiguration)
        {
            InitializeComponent();

            if (standardDEConfig != null)
            {
                this.threshold   = standardDEConfig.Threeshold;
                tbThreshold.Text = threshold.ToString();
                cbEmbeddingDirection.SelectedIndex = (int)standardDEConfig.EmbeddingDirection;
                cbR.IsChecked = standardDEConfig.EmbeddingChanels.Contains(EmbeddingChanel.R);
                cbG.IsChecked = standardDEConfig.EmbeddingChanels.Contains(EmbeddingChanel.G);
                cbB.IsChecked = standardDEConfig.EmbeddingChanels.Contains(EmbeddingChanel.B);
                ComboBoxItem standardComboBoxItem = new ComboBoxItem();
                standardComboBoxItem.Content    = "Standard";
                standardComboBoxItem.IsSelected = currentConfiguration is DifferencesExpansionConfiguration;
                cbConfigurationType.Items.Add(standardComboBoxItem);
            }

            if (bruteForceDEConfig != null)
            {
                cbHorizontal_BF.IsChecked = bruteForceDEConfig.EmbeddingDirections.Contains(Direction.Horizontal);
                cbVertical_BF.IsChecked   = bruteForceDEConfig.EmbeddingDirections.Contains(Direction.Vertical);
                cbR_BF.IsChecked          = bruteForceDEConfig.EmbeddingChanels.Contains(EmbeddingChanel.R);
                cbG_BF.IsChecked          = bruteForceDEConfig.EmbeddingChanels.Contains(EmbeddingChanel.G);
                cbB_BF.IsChecked          = bruteForceDEConfig.EmbeddingChanels.Contains(EmbeddingChanel.B);
                ComboBoxItem bruteForceItem = new ComboBoxItem();
                bruteForceItem.Content    = "Brute force";
                bruteForceItem.IsSelected = currentConfiguration is DifferenceExpansionBruteForceConfiguration;
                cbConfigurationType.Items.Add(bruteForceItem);
            }
        }
        public Bitmap Encode(Bitmap inputImage, string payload, AlgorithmConfiguration configuration)
        {
            DifferencesExpansionConfiguration config = (DifferencesExpansionConfiguration)configuration;
            Bitmap image = new Bitmap(inputImage);
            // For multiple embedding channels payload to encode is divided into chunks - one for each RGB channel
            List <string> payloadChunks = GetPayloadChunks(payload, config.EmbeddingChanels);
            int           chunkNumber   = 0;

            foreach (EmbeddingChanel embeddingChanel in Enum.GetValues(typeof(EmbeddingChanel)))
            {
                if (config.EmbeddingChanels.Contains(embeddingChanel))
                {
                    // Encoding of payload chunk performed for given channel of RGB
                    EncodePayloadIntoImage(image, payloadChunks[chunkNumber++], config.EmbeddingDirection, config.Threeshold, embeddingChanel);
                }
            }
            return(image);
        }
 private void BtnConfigDE_Click(object sender, RoutedEventArgs e)
 {
     if (isWatermarkingModeSelected())
     {
         DifferencesExpansionConfiguration config = (DifferencesExpansionConfiguration)standardEncodingDEConfig;
         var dialogBox = new ConfigurationDialogBox.DifferencesExpansionConfiguraitonDialogBox(config, null, activeEncodingDEConfig)
         {
             Owner = this,
         };
         dialogBox.ShowDialog();
         AlgorithmConfiguration newConfig = GetConfigurationBasedOnDialogBoxResult(dialogBox);
         if (newConfig != null)
         {
             standardEncodingDEConfig = newConfig;
             activeEncodingDEConfig   = standardEncodingDEConfig;
         }
     }
     if (isAnalyzingModeSelected())
     {
         DifferencesExpansionConfiguration          deConfig           = (DifferencesExpansionConfiguration)standardDecodingDEConfig;
         DifferenceExpansionBruteForceConfiguration deBruteForceConfig = (DifferenceExpansionBruteForceConfiguration)bruteForceDecodingDEConfig;
         var dialogBox = new ConfigurationDialogBox.DifferencesExpansionConfiguraitonDialogBox(deConfig, deBruteForceConfig, activeDecodingDEConfig)
         {
             Owner = this,
         };
         dialogBox.ShowDialog();
         AlgorithmConfiguration newConfig = GetConfigurationBasedOnDialogBoxResult(dialogBox);
         if (dialogBox.cbConfigurationType.Text == "Standard" && newConfig != null)
         {
             standardDecodingDEConfig = newConfig;
             activeDecodingDEConfig   = standardDecodingDEConfig;
         }
         else if (dialogBox.cbConfigurationType.Text == "Brute force" && newConfig != null)
         {
             bruteForceDecodingDEConfig = newConfig;
             activeDecodingDEConfig     = bruteForceDecodingDEConfig;
         }
     }
 }
 private Tuple <Bitmap, string> Decode(Bitmap image, DifferencesExpansionConfiguration config)
 {
     try
     {
         List <string> payloadChunks = new List <string>();
         foreach (EmbeddingChanel embeddingChanel in Enum.GetValues(typeof(EmbeddingChanel)))
         {
             if (config.EmbeddingChanels.Contains(embeddingChanel))
             {
                 // For each RGB elected in configuration chunk of embedded payload is retrieved
                 payloadChunks.Add(DecodeImage(image, config.EmbeddingDirection, embeddingChanel));
             }
         }
         // Payload from all selected channels are concatenated to build whole message
         string payload = String.Join("", payloadChunks);
         // Payload and oryginal image are returned
         return(new Tuple <Bitmap, string>(image, payload));
     }
     catch
     {
     }
     return(null);
 }