对了,我发现了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 受到影响。