Как исправить проблему с выравниваем байтов при загрузке изображения с помощью libjpeg?

Есть изображение размером 259x194. При его загрузке с помощью libjpeg начинается "веселье".
Изображение получается сдвинутым примерно на половину.

void JPEGTexture::genData()
    {
        FILE *f=fopen(filepath.c_str(),"rb");
        if (f==NULL) return;
        struct jpeg_error_mgr jerr;
        struct jpeg_decompress_struct cinfo;
        cinfo.err = jpeg_std_error(&jerr);
        jpeg_create_decompress(&cinfo);
        jpeg_stdio_src(&cinfo, f);
        jpeg_read_header(&cinfo, TRUE);
        
        imageWidth = cinfo.image_width;
        imageHeight = cinfo.image_height;
        
        initTextureSize();
        
        std::vector<unsigned char> buf(3*imageWidth*imageHeight);
        
        jpeg_start_decompress(&cinfo);
        for (int y=0;y<imageHeight;y++) {
            JSAMPLE *rows[1];
            rows[0]=&buf[3*imageWidth*(imageHeight-1-y)];
            jpeg_read_scanlines(&cinfo,rows,1);
        }
        
        GLuint texture;
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);
        
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, getTextureWidth(), getTextureHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
        
        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, getImageWidth(), getImageHeight(),GL_RGB, GL_UNSIGNED_BYTE, &buf[0]);
        
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        
        this->textureID=texture;
        
        jpeg_destroy_decompress(&cinfo);
        fclose(f);
    }


не получается исправить проблему с выравниванием
  • Вопрос задан
  • 230 просмотров
Пригласить эксперта
Ответы на вопрос 2
Nipheris
@Nipheris Куратор тега C++
Придется задать несколько уточняющих вопросов:
0) libjpeg обязательно? Если вам для загрузки текстур, FreeImage отлично подойдет, он конечно толще по-определению, но с ним проще на порядок, да и формат переключить сможете, если что.
1) вы уверены, что проблема в том, как грузится текстура, а не как вы рисуете? Если в шейдере сплошным цветом залить, все нормально отрисовывается?
2) с цветами проблемы есть? форматы цвета точно совпадают?
3) как решаете проблему с тем, что размер картинки - не степень двойки?
4) getTextureWidth(), getTextureHeight() - что делают эти вызовы? Какой размер у текстуры получается?
Ответ написан
@DISaccount
Изображения должны быть выровнены по границе 4 байта.
std::vector<unsigned char> buf(3*imageWidth*imageHeight);
...
rows[0]=&buf[3*imageWidth*(imageHeight-1-y)];

Вместо 3*imageWidth должен быть параметр imageStep. imageStep не меньше imageWidth и выровнен по границе 4 байта. imageStep - это количество байт между строками изображения.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы