Java JPEG DCT系数在我修改后自行改变

时间:2014-04-30 17:45:50

标签: java image jpeg steganography dct

我有一个程序可以改变JPG图像的DCT系数。 这是给我DCT系数的代码

    public int[] quantizeBlock(double inputData[][], int code) {
    int outputData[] = new int[blockSize * blockSize];
    int i, j;
    int index;
    index = 0;
    for (i = 0; i < 8; i++) {
        for (j = 0; j < 8; j++) {
            // The second line results in significantly better compression.

            outputData[index] = (int) (Math.round(inputData[i][j]
                    * (((double[]) (Divisors[code]))[index])));
            // outputData[index] = (int)(((inputData[i][j] * (((double[])
            // (Divisors[code]))[index])) + 16384.5) -16384);
            index++;
        }
    }

    return outputData;
}

这是修改前的DCT矩阵

     -43 7 0 0 0 0 0 0 
     -8 1 2 -1 0 0 0 0 
     -1 -1 -1 1 0 0 0 0
     -2 1 0 -1 0 0 0 0
      6 0 0 0 0 0 0 0
     -2 0 1 0 0 0 0 0
     -1 0 0 0 0 0 0 0
      0 0 0 0 0 0 0 0

这是在修改之后

      -42 8 0 0 0 0 0 0
      -7 1 3 0 0 0 0 0
       0 0 0 1 0 0 0 0 
      -1 1 0 0 0 0 0 0 
       7 0 0 0 0 0 0 0 
      -1 0 1 0 0 0 0 0
       0 0 0 0 0 0 0 0

使用图像缓冲区保存图像后,我使用创建的图像从中获取修改后的DCT,但我得到的只是:

      -41 9 0 0 0 0 0 0
      -6 1 4 0 0 0 0 0 
       0 0 0 1 0 0 0 0
       0 1 0 0 0 0 0 0 
       8 0 0 0 0 0 0 0 
       0 0 1 0 0 0 0 0
       0 0 0 0 0 0 0 0
       0 0 0 0 0 0 0 0 

我已经看到一个问题,在IOS中使用库的用户做了同样的事情并且遇到了同样的问题。显然,库重新映射了图像,隐藏的消息被破坏了。

我不知道我是否属于这种情况。我使用Image Buffer来创建图像。

1 个答案:

答案 0 :(得分:1)

可能发生的一些事情。首先是舍入错误。 JPEG过程引入了小错误。你的所有价值都是一次性的。这可能来自四舍五入。

第二个是量化。您的值可能会被量化(分割)。您的示例并未指出示例之间可能发生的压缩阶段。