Повторете редовете и колоната с растерно изображение

знам, че може да е лесно, но не можах да намеря решение за това.

трябва да получа следващия ред растерно изображение, след като използвам цялото растерно изображение на текущото растерно изображение. Правя програма за стенография, в която крия текстов файл в изображението. Всеки знак се съхранява в 8 различни байта. така че след скриване на текст в 1-ва колона трябва да получа следващата колона и така нататък. Много съм слаб в това. Опитах това за 1-ви ред, но не знам за други редове според дължината на текста.

private void HIDE(){
                if (textBox1.Text != "")
                {
                    Bitmap bitmap = (Bitmap)pictureBox1.Image;
                    int next,width=0;
                    for (int t = 0; t < textBox1.Text.Length; t++)
                    {
                        next = 8 * t;
                            for (int i = 0; i < 8; i++)
                            {
                                if (i * t <= bitmap.Width/8)
                                {
                                     //hiding code for 1st row
                                }
                                else 
                                {
                                    //hiding code for 2nd row
                                }
                            }

                    }
                }}

person Sharat    schedule 13.04.2014    source източник
comment
Свързани: stackoverflow.com/a/5614641/38368   -  person Danny Varod    schedule 13.04.2014
comment
възможен дубликат на Помощ за Bitmap decoder   -  person Danny Varod    schedule 13.04.2014


Отговори (1)


Какво ще кажете за това?

private void HIDE(){
              if (textBox1.Text != "")
              {
                  Bitmap bitmap = (Bitmap)pictureBox1.Image;
                  // Starting point for embedding secret
                  int x0=0, y0=0;
                  // Error checking, to see if text can fit in image
                  int imageSize = bitmap.Width * bitmap.Height;
                  if (imageSize - x0 * bitmap.Width - y0 < 8 * textBox1.Text.Length)
                  {
                      // Deal with error
                  }
                  // Ready to embed
                  for (int t = 0; t < textBox1.Text.Length; t++)
                  {
                      for (int i = 0; i < 8; i++)
                      {
                          // Check if y0 has exceeded image width
                          // so to wrap around to the new row
                          if (y0 == bitmap.Width)
                          {
                              x0++;
                              y0=0;
                          }
                          // x0, y0 are now the current pixel coordinates
                          //
                          // EMBED MESSAGE HERE
                          //
                          y0++;  // Move to the next pixel for the next bit
                      }
                  }
              }}

Например, ако имате ширина 10, това трябва да са координатите за първите две букви от вашия текст:

Писмо 1:

(0, 0)

...

(0, 7)

Писмо 2:

(0, 8)

(0, 9)

(1, 0)

...


ВАЖНА ЗАБЕЛЕЖКА: Изглежда, че не скривате дължината на текста и процесът на декодиране няма да знае колко пиксела да прочете, за да извлече съобщението.

Ако сте се занимавали с него някъде другаде или декодерът винаги знае дължината, това е добре. В противен случай искате да използвате определен брой пиксели на фиксирано място (обикновено първите 32), за да кодирате в двоичен код дължината на вашия текст. Например,

int secretLength = 8 * textBox1.Text.Length;
string binary = Convert.ToString(secretLength, 2);

За текста „Здравей свят“, двоичният файл ще бъде 00000000000000000000000001011000. Сега можете да ги вградите във вашите 32 конкретни пиксела и действителното тайно съобщение след това. Не забравяйте, че в този случай вашето изображение трябва да има поне 8 * TextBox1.Text.Length + 32 брой пиксели, за да побере цялата тайна.

Използването на 4 байта за дължината на текста е такова прекаляване, като се имат предвид преди всичко ограниченията за размера на изображението. Можете да използвате по-малко байтове, ако винаги можете да гарантирате, че размерът на текста никога няма да надвиши определена дължина, или по-динамичен подход, като това

Справка: Преобразуване на целочислен към двоичен низ, заимствано от тук.

person Reti43    schedule 13.04.2014
comment
Благодаря много за това. Имам кода за скриване. Единственото нещо, което ме притесняваше, беше формулата. Благодарение на теб. - person Sharat; 13.04.2014