非标准宽高比格式的图像裁剪

问题描述

我面临的问题是在裁剪掉部分边缘后呈现正确的图像。我只能在非标准的宽高比中观察到这一点。 在我的情况下,宽度为1228,高度为972,长宽比为1.26。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glClearColor(0.0,0.0,1.0);


float vx = float(m_uiImageWidth) / float(m_uiImageWidth);
float vy = float(m_uiImageHeight) / float(m_uiImageWidth);

glEnable(GL_TEXTURE_2D);
    
    glTexImage2D(GL_TEXTURE_2D,3,m_uiImageWidth,m_uiImageHeight,GL_BGR,GL_UNSIGNED_BYTE,m_arrayBufferVS1);

    glLoadIdentity();

    glBindTexture(GL_TEXTURE_2D,m_texture);

    //glTranslatef(0.0f,0.0f,-1.36f);
    glTranslatef(0.0f,-1.358f);

    //normal
    if(m_bContextMenunormal)
        glrotatef(180,1,0);
    else if (m_bContextMenuRotate180 && m_bContextMenuMirror) 
    {
        //do nothing
    }
    else if(m_bContextMenuMirror)
        glrotatef(180,0);
    else if(m_bContextMenuRotate180)
        glrotatef(180,0);
    
    glScalef(1,-1,1);

    glBegin(GL_QUADS);

        glTexCoord2f(1.0f,1.0f); //top right
        glVertex3f(vx,vy,0.0f);

        glTexCoord2f(0.0f,1.0f); // left top
        glVertex3f(-vx,0.0f); //left bottom
        glVertex3f(-vx,-vy,0.0f);

        glTexCoord2f(1.0f,0.0f); //right bottom
        glVertex3f(vx,0.0f);

    glEnd();

gldisable(GL_TEXTURE_2D);

这是我的代码段。如果有人指出我犯的错误和纠正建议,那将是一个很大的帮助。

解决方法

修改对glTexCoord2f的调用,十进制值将在四个顶点之间进行内插,然后乘以图像的宽度和高度,以计算从纹理绘制到屏幕的每个像素的坐标。如果要将纵横比为1.26的图像左右裁剪为正方形,则可以使用以下纹理坐标:

glTexCoord2f(1.0f - 0.13f,1.0f); //top right
glTexCoord2f(0.0f + 0.13f,1.0f); // left top
glTexCoord2f(0.0f + 0.13f,0.0f); //left bottom
glTexCoord2f(1.0f - 0.13f,0.0f); //right bottom

0.13 * 1228为159.64像素,当从1228像素宽的纹理的任一侧移除159.64像素时,图像的其余部分为972像素宽,这意味着绘制的像素的纵横比将为1:1,因为您的纹理高972像素