【问题标题】:Java JPG DCT coefficients alter by themselfs after I modify themJava JPG DCT系数在我修改后会自行改变
【发布时间】:2014-06-17 04:00:33
【问题描述】:

我有一个程序可以改变 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 来创建图像。

【问题讨论】:

  • 您是否尝试过自己将原始数据写入 jpeg 格式?与问题无关,但与算法的性能相关,但为什么不以之字形顺序嵌入/提取系数?
  • 这个问题的描述很差。你还没有从头到尾一步一步地布置你如何嵌入你的秘密和保存图像。一百行代码的链接,其唯一目的是从文件中加载图像并将其保存为 jpeg,并不会削减它。人们甚至不会读到那个。按照目前的情况,我建议您查看 F5 算法的源代码(用 Java 编写,更改 DCT 并保存为 jpeg),看看应该如何完成。

标签: java image jpeg steganography dct


【解决方案1】:

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

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

【讨论】:

  • 我使用 java2s.com/Code/Java/2D-Graphics-GUI/… 进行 JPEG 压缩。我不明白的这段代码遵循压缩步骤
  • 查看是否发现任何大于 +/-1 的变化。
  • @EmilGrigore 在您的链接中,StandardUsage 表示 100 的质量几乎与原始图像相同。所以你会受到一些压力。
  • 这听起来像是舍入错误。 JPEG本质上需要对整数进行浮点运算。这通常通过移位和使用定点数学来完成。这仍然会导致轻微的错误。
  • 就像我在上面的评论中所说的那样,该代码中的 StandardUsage 方法表示即使质量为 100 也无法保存确切的图像。
猜你喜欢
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 2015-04-08
  • 2012-12-01
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多