【问题标题】:Using libpng to "split" an image into segments使用 libpng 将图像“分割”成段
【发布时间】:2011-06-15 15:32:26
【问题描述】:

我正在尝试使用 libpng 将图像拆分为不同的块。原因是我无法在我目前正在使用的硬件上加载大于 512x512 的纹理。我之前通过混合使用 SDL 和 SDL_Image 来完成此操作。我基本上使用 SDL_BlitSurface 中的 srcrect 参数来复制图像的一部分,然后将其转换为 OpenGL 纹理。将其与水平然后垂直的简单循环相结合,我能够获得一组纹理,每个最大为 512x512。然后只需将它们渲染到正确的位置即可。

现在,我没有使用 SDL 的奢侈,所以我认为可以通过 libpng 自己直接执行此操作。基于一些谷歌搜索,我认为这只是使用 png_read_rows 来读取我需要的部分的问题。但这就是我卡住的地方,我不确定该怎么做。

另外,如果你想知道为什么我不只是在 gimp/photoshop/paint 或其他什么中分割图像,那是因为我不控制它们并且在运行时下载它们。

提前感谢您的帮助。

【问题讨论】:

    标签: opengl libpng


    【解决方案1】:

    您不必费心提取瓷砖。你可以告诉 OpenGL 只使用你给它的数据的一部分来初始化纹理。关键字是 glPixelStorei(GL_UNPACK...) 参数。假设您的输入图像的尺寸为img.widthimg.height,并且RGB 像素有4 个字节,即每个像素一个字节填充,并且您的子图片由subimg.off_xsubimg.off_ysubimg.width、@987654326 定义@。然后你可以像这样加载它:

    glPixelStorei(GL_UNPACK_ROW_LENGTH, img.width)
    glPixelStorei(GL_UNPACK_SKIP_PIXELS, subimg.off_x)
    glPixelStorei(GL_UNPACK_SKIP_ROWS, subimg.off_y)
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
    glTexImage2D(GL_TEXTURE_2D, GL_RGB, 0,
                 subimg.width, subimg.height, 0,
                 GL_RGBA, GL_UNSIGNED_BYTE, pixeldata)
    

    【讨论】:

      猜你喜欢
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      • 2017-05-24
      相关资源
      最近更新 更多