2014-01-20 7 views
0

Я попытался прочитать этот абзац с сайта, но я не понимаю, почему «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++; 
     } 
     } 
    } 

ответ

1

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

Функции embedInteger и embedByte практически схожи.

  • embedInteger имеет дело с вложением длины сообщения в первые 32 пикселя.
  • embedByte вставляет символы сообщения, один за другим. Каждый раз, когда он вызывается, он принимает в качестве ввода следующий символ в вашем сообщении в байтовой форме, b[i]. Там он вмещает один бит на пиксель, всего 8 бит на байт.
+0

Благодарим за ответ, embedInteger - это дело с вложением длины сообщения в первые 32 пикселя? но как насчет embedByte ?? –

+0

Я уточнил ответ для лучшего уточнения. – Reti43

+0

Извините, это может быть глупый вопрос, зачем нужен embedInteger, поскольку мы могли просто вставлять сообщения один за другим с помощью embedByte. Он может вставлять только один бит на пиксель? –