Как манипулировать JPEG в cpp с помощью символов?

Я испытываю очень странное поведение в cpp. Я делаю некоторую параллельную обработку изображений с использованием инфраструктуры MPI, и мне нужно преобразовать 2D-массив JSAMPLE в плоский массив беззнаковых символов. Я могу сделать это, однако, когда я пытаюсь записать изображение из плоского массива в файл JPEG, вывод получается нечетким, однако, если я устанавливаю значение вывода из плоского массива в той же точке, я считываю его из 2d массив работает нормально.

Это очень странно для меня. Я довольно опытный разработчик cpp, но не так уж много работал с библиотекой JPEG.

Я думаю, что это может быть связано с распределением памяти.

// create a flat array of unsigned chars from image
char* flat_image_array = new  char[span*Input.Width*Input.Components];
for(int j = 0; j < span; ++j) {
    for (int k = 0; k < Input.Width * Input.Components; ++k) {
        flat_image_array[j*k+k] = imageSegment[j][k];
        // if I set output here it works fine

        //Output.Rows[j][k] =flat_image_array[j*k+k];
    }
}

for(int j = 0; j < span; ++j) {
    for (int k = 0; k < Input.Width * Input.Components; ++k) {
        //but if I set output here the image comes out very fuzzy
        Output.Rows[j][k] = flat_image_array[j*k+k];
    }
}

std::stringstream file;
file << "Data/segment_" << (i) <<".jpg";
if(!Output.Write(file.str().c_str())){
    printf("Cannot write image\n");
    return;
}

1 ответ

Вместо flat_image_array[j*k+k] ты хочешь flat_image_array[j*Input.Width+k], При неправильной индексации flat_image_array Вы оставляете дыры и перезаписываете предыдущие значения.

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