0

这是使用 JAVA 在数字图像中嵌入消息的链接,它们也提供了示例代码,但是当我尝试嵌入超过 38 个字符时,当我运行解码部分时它会给出不同的输出。我正在使用 111x115 (6.38k) 图像。

我的问题在这篇文章中,它说 n=(p-32)/8 ,n 是消息的最大长度,P 是像素数。所以如果我计算我使用的图像,它将是 n=(6380-32)/8=793.5。因为我可以在这张图片中存储 793.5 个字符,但是当我尝试放置超过 38 个字符时,当我解码部分时它会给我不同的输出。(38字以下也可以)

4

1 回答 1

1

对了,我发现了bug!正如我所预料的那样,一些像素被覆盖了。问题出在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 -> 25 -> 39。巧合的是,11和25写入的共享像素,嵌入了相同的位并且没有表示错误。但随着 39 的推出,25 受到影响。

于 2014-01-23T20:40:22.290 回答