Сохранение значений RGB в jpeg используйте libjpeg, получая странные результаты

У меня есть программа, которая загрузит изображение jpeg и позволит пользователю рисовать на изображении и повторно сохранить его.

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

Изображение

Результатом должно было стать только изображение улитки с линией.

Вот мой код

bool IOManager::save_jpg_to_file(const char *file_name) {
struct jpeg_compress_struct cinfo;

struct jpeg_error_mgr jerr;

FILE * outfile;
JSAMPROW row_pointer[1];
int row;

JSAMPLE * image_buffer;

cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);

if ((outfile = fopen(file_name_.c_str(), "wb")) == NULL) {
    fprintf(stderr, "can't open %sn", file_name_);
    return false;
}

jpeg_stdio_dest(&cinfo, outfile);

int img_width = pixel_buffer_->width();
int img_height = pixel_buffer_->height();

cinfo.image_width = img_width;
cinfo.image_height = img_height;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;

jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, 100, TRUE);

jpeg_start_compress(&cinfo, TRUE);

unsigned char bytes[img_width * 3];

while (cinfo.next_scanline < cinfo.image_height) {
    for (int i = 0;  i < img_width; i+=3){
        ColorData colorData = pixel_buffer_->get_pixel(i, cinfo
                .next_scanline);
        bytes[i] = static_cast<int>(colorData.red()*255) & 0xff;
        bytes[i+1] = static_cast<int>(colorData.green()*255) & 0xff;
        bytes[i+2] = static_cast<int>(colorData.blue()*255) & 0xff;
    }
    row_pointer[0] = bytes;
    (void) jpeg_write_scanlines(&cinfo, row_pointer, 1);
}

jpeg_finish_compress(&cinfo);
fclose(outfile);
jpeg_destroy_compress(&cinfo);

std::cout << "Done" << std::endl;

return true;
}

PixelBuffer — это просто 2D массив значений RGB.

Я не могу понять, почему он генерирует эти странные линии, любая помощь?

1 ответ

  1. Просто разместите мой комментарий как отдельный ответ. Кажется, что вы неправильно обращаетесь к данным буфера пикселей: вы перепрыгиваете через 3 пикселя в буфере источника и назначения, в то время как (учитывая фрагмент кода) похоже, что вам нужно обработать каждый пиксель вашего источника. Убедитесь, что при итерации индекс увеличивается только на 1, а не на 3 pixel_buffer_