这是Link使用JAVA在数字图像中嵌入消息,它们也提供示例代码,但是当我尝试嵌入超过38个字符时,它会在我运行解码部分时提供不同的输出。 我使用111x115(6.38k)图像。
我的问题在于本文,它说n =(p-32)/ 8,n是消息的最大长度,P是像素数。所以,如果我计算我使用的图像,它将是n =(6380-32)/8=793.5。 因为我可以在这个图像中存储793.5个字符,但是当我尝试放置超过38个字符时,当我解码部分时它会给我不同的输出。 (38岁以下的人很好)
答案 0 :(得分:1)
是的,我发现了这个错误!正如我所料,有些像素被覆盖了。问题出在embedByte
函数中,特别是在for循环的条件中。
for(int i=startX; i<maxX && count<8; i++) {
for(int j=startY; j<maxY && count<8; j++) {
每个循环都将迭代,直到您到达行/列的末尾或计数达到8.当您终止时会出现问题,因为已到达行/列的末尾。为了证明这一点,这就是你的形象所发生的事情。
第一个字符嵌入像素(0,32),(0,33),...,(0,39)。这一切都很简单,直到你到达第11个角色,你得到以下内容。
(0, 112)
(0, 113)
(0, 114)
(1, 112)
(1, 113)
(1, 114)
(2, 112)
(2, 113)
造成这种混乱的原因是(0,114)。在j = 114时,j循环已达到其极限并退出。由于count还不是8,我们回到i循环,它增加1然后再次进入j循环,从startY = 112开始。这解释了(1,112)以及接下来会发生什么。这些像素不应该被更改,因为它们将在第25个字符期间被覆盖(通常是第一次写入)。相反,你应该得到这个:
(0, 112)
(0, 113)
(0, 114)
(1, 0)
(1, 1)
(1, 2)
(1, 3)
(1, 4)
要实现这一点,一旦你到达j边缘,你想重置startY。您可以通过在j循环中添加以下代码来完成此操作。
if(j==maxY-1) {
startY = 0;
}
同样,您希望在extractByte
函数中为解码过程添加此更正。
由于您可以在115像素中容纳大约14个字符,因此就会出现问题。这解释了11 - &gt; 25 - &gt;巧合的是,11和25写的共享像素嵌入相同的位并且没有表达错误。但随着39的引入,25受影响。