Сохранение сообщения в изображение

Я попытался прочитать этот абзац с веб-сайта, но я не понимаю, почему «32-й пиксель хранит биты, необходимые для восстановления значения байта, необходимого для создания исходной строки».

Это попытка перевести сообщение в альфа-канал (прозрачность) (ARGB).

В этом коде ниже, зачем нужно вставлять как целое число, так и байт

 int imageWidth = img.getWidth(), imageHeight = img.getHeight(),
 imageSize = imageWidth * imageHeight;
 if(messageLength * 8 + 32 > imageSize) {
    JOptionPane.showMessageDialog(this, "Message is too long for the chosen image",
       "Message too long!", JOptionPane.ERROR_MESSAGE);
    return;
   }
   embedInteger(img, messageLength, 0, 0);

   byte b[] = mess.getBytes();
   for(int i=0; i<b.length; i++)
      embedByte(img, b[i], i*8+32, 0);
   }

 private void embedInteger(BufferedImage img, int n, int start, int storageBit) {
   int maxX = img.getWidth(), maxY = img.getHeight(), 
      startX = start/maxY, startY = start - startX*maxY, count=0;
   for(int i=startX; i<maxX && count<32; i++) {
      for(int j=startY; j<maxY && count<32; j++) {
         int rgb = img.getRGB(i, j), bit = getBitValue(n, count);
         rgb = setBitValue(rgb, storageBit, bit);
         img.setRGB(i, j, rgb);
         count++;
         }
      }
   }

private void embedByte(BufferedImage img, byte b, int start, int storageBit) {
   int maxX = img.getWidth(), maxY = img.getHeight(), 
      startX = start/maxY, startY = start - startX*maxY, count=0;
   for(int i=startX; i<maxX && count<8; i++) {
      for(int j=startY; j<maxY && count<8; j++) {
         int rgb = img.getRGB(i, j), bit = getBitValue(b, count);
         rgb = setBitValue(rgb, storageBit, bit);
         img.setRGB(i, j, rgb);
         count++;
         }
      }
   }

person Jarek Huang    schedule 20.01.2014    source источник


Ответы (1)


Вам нужно сохранить длину сообщения, чтобы знать, сколько пикселей нужно прочитать, чтобы извлечь сообщение. Поскольку длину сообщения нельзя предсказать, выделяется 32 бита (для первых 32 пикселей).

Функции embedInteger и embedByte почти аналогичны.

  • embedInteger занимается встраиванием длины сообщения в первые 32 пикселя.
  • embedByte встраивает символы вашего сообщения один за другим. Каждый раз, когда он вызывается, он принимает в качестве входных данных следующий символ вашего сообщения в байтовой форме, b[i]. Там он встраивает один бит на пиксель, всего 8 бит на байт.
person Reti43    schedule 21.01.2014
comment
Спасибо за ответ, embedInteger должен иметь дело с встраиванием длины сообщения в первые 32 пикселя ?? а как насчет embedByte?? - person Jarek Huang; 21.01.2014
comment
Извините, это может быть глупый вопрос, зачем нужен embedInteger, если мы можем просто вставлять сообщения одно за другим, используя embedByte. Это только может вставлять один бит на пиксель? - person Jarek Huang; 21.01.2014
comment
потому что я пытался встроить массив байтов двоичного файла (128 байт) в изображение, но когда я попытался извлечь массив байтов, это был не тот массив, в который я его вставил. Потому что он слишком велик ?? - person Jarek Huang; 21.01.2014
comment
Разница тонкая. embedInteger принимает длину сообщения как целое число (int n) и имеет предел встраивания 32. embedByte принимает символ сообщения в байтовой форме (byte b), которая была преобразована с помощью byte b[] = mess.getBytes(). С небольшой модификацией у вас может быть одна функция и для messageLength, и для сообщения, но автор этого не сделал. - person Reti43; 21.01.2014
comment
Я не совсем понял, что вы пытались там сделать и почему это не удалось. - person Reti43; 21.01.2014
comment
Еще раз спасибо. Последний вопрос с этого сайта, n=(p-32)/8, зачем здесь минус 32. - person Jarek Huang; 21.01.2014
comment
Это то же самое, что p = 8*n + 32, где p — количество пикселей в изображении, а n — количество символов в вашем сообщении. Для встраивания каждого символа требуется 8 бит, и вам нужны дополнительные 32 бита для длины сообщения. Таким образом, вам нужно иметь как минимум 8 * n + 32 пикселя на вашем изображении. И наоборот, если у вас p пикселей, вы внедрили не более (p-32)/8 текстовых символов. - person Reti43; 21.01.2014
comment
Это действительно полезно для меня. Я оценил. Я пытаюсь встроить массив байтов двоичного файла со вчерашнего дня, но когда я извлекаю массив байтов, какая разница в предыдущем. Здесь я задаю этот вопрос [ссылка]stackoverflow.com/questions/21267677/ Не могли бы вы сказать мне, где я ошибся, спасибо. - person Jarek Huang; 21.01.2014