Странные символы Ascii в выводе декодирования закодированного изображения Java

Я пишу программу шифрования изображений, в которой я кодирую строку внутри изображения.

Я работаю с .png изображениями.

Кодирование выполняется следующими шагами:

  • Пиксели изображения сохраняются в 2D-массиве с помощью getRGB().
  • Каждый символ в строке преобразуется в двоичную форму и сохраняется в массиве.
  • LSB каждого байта 4byte пикселя изменяется в соответствии с каждым битом двоичной формы символа. LSB первого байта находится на 0-й позиции, LSB второго байта — на 8-й позиции, третий байт — на 16-й позиции, а четвертый байт — на 24-й позиции.
  • После кодирования измененные пиксели записываются в исходное изображение с помощью метода setRGB().

Для расшифровки:

  • Считайте пиксели изображения с помощью getRGB();
  • Для извлечения данных применяется обратный метод кодирования.
  • После каждого 8-го бита int, содержащий декодированные биты, преобразуется в символ. Затем инициализируется нулем для другого символа.

                if((pixels[i][j] & change)==1)  
                {
                    tempText|=1 ;
                }
    
                tempText<<=1;
    

Где изменение составляет 1 256 65536 16777216 в зависимости от итерации. Чьи 0-й, 8-й, 16-й и 24-й биты являются одним.

Код компилируется нормально. Но после декодирования я получаю на выходе странные символы ascii. Я не мог найти причину этого. Поэтому я консультируюсь здесь со специалистами.


person Umer Farooq    schedule 20.01.2013    source источник
comment
Вы сохраняете изображение в формате JPEG?   -  person Joey    schedule 20.01.2013
comment
Это может работать только с форматами сжатия без потерь (например, PNG).   -  person MrSmith42    schedule 20.01.2013
comment
@Umer Farooq: то, что ты делаешь, называется стеганографией. Я добавил тег соответственно.   -  person TacticalCoder    schedule 20.01.2013
comment
@Umer Farooq: нет проблем ... Кстати, в пасте ideone.com вы написали Stegnography. Это настоящая стеганография (вы забыли букву «а»); )   -  person TacticalCoder    schedule 20.01.2013
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 21.01.2013
comment
Ваша проблема, скорее всего, в том, что вы не загружаете изображение должным образом. В таком случае альфа-канал по умолчанию будет равен 255 независимо от его сохраненного значения. Чтобы проверить это, загрузите свое изображение, проверьте альфа-канал нескольких пикселей и просто измените его на другие числа. Они могут быть настолько разными, насколько вы хотите. Сохраните изображение и загрузите его снова. Является ли альфа-канал измененных пикселей тем, на что вы их изменили, или теперь они имеют другие значения?   -  person Reti43    schedule 08.05.2014


Ответы (1)


(это слишком длинно для комментария)

Вы написали:

целое изменение=0;

                            for(int k=0;k<4;k++)
                            {
                                    if(k==0)
                                    {
                                            change=1;
                                    }
                                    else
                                            if(k==1)
                                            {
                                                    change=256;
                                            }
                                            else
                                                    if(k==2)
                                                    {
                                                            change=65536;
                                                    }
                                                    else
                                                            if(k==3)
                                                            {
                                                                    change = 16777216;
                                                            }

И там много повторений. Обычно компьютеры очень хорошо устраняют повторения.

Это можно переписать, если я не ошибаюсь из-за этого одного вкладыша:

final int change = 1 << 8 * k;
person TacticalCoder    schedule 20.01.2013
comment
Спасибо что подметил это . Я знаю, что этот код нуждается в большой доработке, но в данный момент я пытаюсь решить эту странную проблему вывода. - person Umer Farooq; 20.01.2013
comment
Сталкивались ли вы с какой-либо проблемой в этом коде, которая вызывает эту аномалию в выводе? - person Umer Farooq; 20.01.2013