Изображение переворачивается, вывод OpenGL в JPEG с использованием libjpeg

Приведенный ниже код помогает мне преобразовать вывод OpenGL в изображение JPEG с помощью libjpg, но результирующее изображение переворачивается по вертикали ...

Код работает отлично, но окончательное изображение переворачивается, я не знаю почему ?!

unsigned char *pdata = new unsigned char[width*height*3];
    glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pdata);

    FILE *outfile;
    if ((outfile = fopen("sample.jpeg", "wb")) == NULL) {
        printf("can't open %s");
        exit(1);
      }

    struct jpeg_compress_struct cinfo;
    struct jpeg_error_mgr       jerr;

    cinfo.err = jpeg_std_error(&jerr);
    jpeg_create_compress(&cinfo);
    jpeg_stdio_dest(&cinfo, outfile);

    cinfo.image_width      = width;
    cinfo.image_height     = height;
    cinfo.input_components = 3;
    cinfo.in_color_space   = JCS_RGB;

    jpeg_set_defaults(&cinfo);
    /*set the quality [0..100]  */
    jpeg_set_quality (&cinfo, 100, true);
    jpeg_start_compress(&cinfo, true);

    JSAMPROW row_pointer;
    int row_stride = width * 3;

    while (cinfo.next_scanline < cinfo.image_height) {
    row_pointer = (JSAMPROW) &pdata[cinfo.next_scanline*row_stride];
    jpeg_write_scanlines(&cinfo, &row_pointer, 1);
    }

    jpeg_finish_compress(&cinfo);

    fclose(outfile);

    jpeg_destroy_compress(&cinfo);

person tinku    schedule 23.02.2012    source источник


Ответы (1)


Система координат OpenGL имеет начало в левом нижнем углу изображения. LIBJPEG предполагает, что источник изображения находится в верхнем левом углу изображения. Внесите следующие изменения, чтобы исправить свой код:

while (cinfo.next_scanline < cinfo.image_height)
{
    row_pointer = (JSAMPROW) &pdata[(cinfo.image_height-1-cinfo.next_scanline)*row_stride];
    jpeg_write_scanlines(&cinfo, &row_pointer, 1);
}
person BitBank    schedule 23.02.2012