Коэффициенты Java JPG DCT изменяются самими собой после их изменения

У меня есть программа, которая изменяет коэффициенты DCT изображения JPG. Это код, который дает мне коэффициенты 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 ответ

Пара вещей с вершины, которые могут происходить. Первый - ошибки округления. Процесс JPEG вводит небольшие ошибки. Все ваши ценности едины. Это может прийти от округления.

Второе - это квантование. Ваши значения могут быть квантованы (разделены). Ваш пример не указывает этапы сжатия, которые могут иметь место между вашими примерами.

Другие вопросы по тегам