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

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

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

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

  • Пиксели изображения сохраняются в двумерном массиве с помощью 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 на выходе. Я не мог найти причину для этого. Поэтому я консультируюсь с экспертами здесь.

1 ответ

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

Вы написали:

int change = 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;
Другие вопросы по тегам