【问题标题】:Image cropping for non standard aspect ratio format非标准纵横比格式的图像裁剪
【发布时间】:2020-12-13 20:13:56
【问题描述】:

我面临着渲染正确图像的问题,其中部分边缘被裁剪掉了。我只能在非标准纵横比的情况下观察到这一点。 在我的情况下,宽度为 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, 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, 0, 3, m_uiImageWidth, m_uiImageHeight, 0, GL_BGR, GL_UNSIGNED_BYTE, m_arrayBufferVS1);

    glLoadIdentity();

    glBindTexture(GL_TEXTURE_2D, m_texture);

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

    //Normal
    if(m_bContextMenuNormal)
        glRotatef(180, 1, 0, 0);
    else if (m_bContextMenuRotate180 && m_bContextMenuMirror) 
    {
        //do nothing
    }
    else if(m_bContextMenuMirror)
        glRotatef(180, 0, 0, 0);
    else if(m_bContextMenuRotate180)
        glRotatef(180, 0, 1, 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, vy, 0.0f);

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

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

    glEnd();

glDisable(GL_TEXTURE_2D);

这是我的代码 sn-p。如果有人指出我犯的错误并提出解决建议,那将是一个很大的帮助。

【问题讨论】:

  • 据我所知,您总是在vy > 1 时裁剪。您拥有的可见范围是每个轴上的 -1 到 1。当 height > width 时,会在屏幕外绘制点。
  • 我在第一次发布问题时犯了一个错误。图片的宽度为 1228,高度为 972

标签: c++ opengl rendering


【解决方案1】:

修改你对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 像素高

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 2014-02-16
    相关资源
    最近更新 更多