2015-03-15 5 views
1

Я пытаюсь реализовать простую программу кодирования, где я могу скрыть сообщение в LSB пикселей изображения. До сих пор у меня есть массив байтов из сообщенияКак изменить LSB каждого пикселя в соответствии с моим сообщением

private static byte[] ConvertMessageToByte(String message, 
     byte[] messageBytes) { 
    // takes in the message and stores them into bytes 
    // returns message byte array 
    byte[] messageByteArray = message.getBytes(); 

    return messageByteArray; 

} 

Я также получил массив байтов для соответствующего изображения, что я хочу, чтобы закодировать на

private static byte[] getPixelByteArray(BufferedImage bufferedImage) { 

    WritableRaster raster = bufferedImage.getRaster(); 

    DataBufferByte buffer = (DataBufferByte) raster.getDataBuffer(); 

    return buffer.getData(); 

} 

До этого момента у меня нет я понимаю следующие шаги после этого. Проигрывать ли я через массив байтов изображения и сохранять значения ARGB в другом массиве байтов? Также как я должен применять значения бит сообщения к пикселям?

ответ

0
private static byte[] ConvertMessageToByte(String message, byte[] messageBytes) { 
    byte[] messageByteArray = message.getBytes(); 
    return messageByteArray; 
} 

Что касается этого метода: convertMessageToBytes является лучшим именем в нижнем регистре первая буква больше обычного, а также тот факт, что вы производите массив из нескольких байт, а не только один. Этот метод не требует второго параметра byte[], поскольку его можно упростить до return message.getBytes(); и произвести тот же эффект. Кроме того, String.getBytes() обычно вызывается в родительской функции, так как он не считается достойным обертывания, поскольку это одна строка. В заключение: удалите этот метод и используйте вместо этого byte[] ba = s.getBytes();.

Лично я обрабатываю изображения как 3_BYTE_RGB, так как они наиболее часто воспринимаются и, действительно, представлены на физическом мониторе или принтере и хранятся в случае многих форматов изображений. HSL (LSB) обычно представляет собой пользовательский конец цвета. Вы должны думать в RGB, а не в HSL.

Вместо того, чтобы иметь дело с изображением как byte[], используйте int BufferedImage.getRGB(int x, int y), так как это проще и доступнее. Возможно, будет использована следующая функция. Я позволю вам написать обратное.

private static int[] getColourAt(BufferedImage image, int x, int, y) { 
    int rgb = image.getRGB(x, y); 
    int r = rgb >> 16; 
    int g = (rgb >> 8) % 256; 
    int b = rgb % 256; 
    return new int[] {r, g, b}; 
} 

Оттуда вы должны проходить через каждый пиксель и настраивать по своему усмотрению.

+0

Спасибо, Scruffy за то, что он освободил меня. Я хочу спросить, почему вы использовали (rgb >> 8)% 256; для зеленого байта. Можете ли вы это прояснить? – Timhua

+0

Для зеленого байта: сначала возьмем весь 3-байтовый int и сдвинем его на 8 мест. Байт находится в формате RGB, поэтому он удаляет 8 бит синего. '(rgb >> 8)' оставляет нам 16 бит (сумма (красный байт * 256) и (зеленый байт * 1)). Окончательная операция, беря модуль 256, удаляет что-либо большее, чем 1 байт, и возвращает последний байт (зеленый байт). См. Http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html для переключения битов и http://docs.oracle.com/javase/tutorial/java/nutsandbolts/opsummary.html для модуля (int% int). – Scruffy

+0

Я реализовал функцию getColourAt() ', но я не могу понять, как изменить LSB в соответствии с моим сообщением. У меня есть функция, называемая 'getMessageBit()', которая выполняет итерацию через сообщение и выделяет значения бит с помощью цикла for for for (int i = 0; i > j) & 1'. Я просто наклоняю, кажется, склоняюсь к тому, чтобы применить их значения к значениям LSB моего массива RGB – Timhua

 Смежные вопросы

  • Нет связанных вопросов^_^