解码编码图像Java的输出中的奇怪Ascii字符

时间:2013-01-20 17:33:04

标签: java image encoding steganography

我正在编写一个Image加密程序,我在其中编码图像中的字符串。

我正在处理.png张图片。

编码按以下步骤执行:

  • 使用getRGB()将图像的像素存储在2D数组中。
  • 字符串中的每个字符都转换为二进制形式并存储在数组中。
  • 4byte像素的每个字节的LSB根据字符的二进制形式的每个位而改变。第一个字节的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 个答案:

答案 0 :(得分:0)

(这对评论来说太长了)

您写道:

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;