【问题标题】:Weird Ascii characters in output of decoding an Encoded image Java解码编码图像Java的输出中的奇怪Ascii字符
【发布时间】:2013-01-03 19:58:27
【问题描述】:

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

我正在使用.png 图像。

编码按以下步骤进行:

  • 图像的像素使用 getRGB() 存储在二维数组中。
  • 字符串中的每个字符都转换为二进制形式并存储在数组中。
  • 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 位为 1。

代码编译良好。但解码后,我在输出中得到奇怪的 ascii 字符。我找不到原因。所以我在这里咨询专家。

【问题讨论】:

  • 您是否将图像保存为 JPEG?
  • 这仅适用于无损压缩格式(如 PNG)
  • @Umer Farooq:你所做的被称为“隐写术”。我相应地添加了标签。
  • @Umer Farooq:没问题...顺便说一句,在您的 ideone.com 粘贴中,您写了“Stegnography”。这真的是“隐写术”(你忘了一个'a'); )
  • 如需尽快获得更好的帮助,请发帖SSCCE

标签: java image encoding steganography


【解决方案1】:

(评论太长了)

你写道:

int 变化=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;

【讨论】:

  • 感谢您指出这一点。我知道这段代码需要大量调整,但目前我正在尝试解决这个奇怪的输出问题
  • 你有没有在这段代码中遇到任何导致输出异常的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
相关资源
最近更新 更多