【问题标题】:can a bmp image format handle transparencybmp图像格式可以处理透明度吗
【发布时间】:2013-01-07 11:47:10
【问题描述】:

我正在制作这个 C++ 程序,它有按钮、按钮容器、聊天框等,我想用纹理包裹它。

我想为我制作的所有矩形生成平滑的边缘,我不希望顶点绘图方法为它完成工作,因为它消耗更多的 CPU 使用率,而且看起来不太好,我不'不知道它是否可以使用纹理坐标(即 glTexCoord(u, v)glVertex2f(x, y) w/c 应该只有 4,因为它是一个四边形)

我使用 SDL_LoadBMP() 加载纹理,w/c 只能加载 .bmp 的格式。(我不太确定,因为它只说 LoadBMP那里)。

所以我的问题是:

  • .bmp 格式可以处理透明度吗?如果有,怎么做?

  • 您能否给我看一些代码示例,使用SOIL 来加载格式为 .gif 或任何其他可以处理图像透明度的格式的图像?

  • 四边形能否在不绘制背景的情况下处理六边形或星形等不规则/多边形形状?

其他问题

*如何导入通过 c++ opengl 呈现的原始文本框,以便我可以将那里的文本复制到剪贴板?至于我程序中的聊天会话。


我创建了自己的库,该库使用 GL_POINTS 绘制文本,并且在调整窗口大小时看起来不太好,因为这些点已展开。文本需要const char* 来避免#include <*string*>,因为我希望我的程序不依赖于C++ 的核心函数。

所以更好的解决方案是使用位图来绘制。

有些人建议使用图像来绘制它,所以我真的需要透明度,因为我希望它只使用四边形来绘制。

【问题讨论】:

    标签: visual-c++ opengl glut soil


    【解决方案1】:

    是的,位图格式确实支持透明度。

    取决于压缩方式,默认RGB方式支持24位颜色,而BITFIELDS压缩方式支持32位颜色(24位+alpha通道)。

    您可以在http://en.wikipedia.org/wiki/BMP_file_format阅读更多内容

    我在 Lime 项目中成功使用了它,这是一个用 Haxe 编写的实现:https://github.com/openfl/lime/blob/4adb7d638d15612e2542ae3a0ef581a786d21183/src/lime/_internal/format/BMP.hx

    【讨论】:

      【解决方案2】:

      此答案仅涉及 bmp 文件是否可以处理透明度,以及如何使用 SOIL 加载 png 文件,我认为如果您通过推理进一步了解,它也会向您展示如何加载 gif 文件。根据this wikipedia article,bmp 是一种通过alpha channel 支持透明度的文件类型。但根据this SO 文章,它没有。以我自己的经验,我还没有找到使 bmp 透明度起作用的方法。所以理论上 32 位 bmp 文件应该支持透明度,但我对此表示怀疑。 (也许我会吃我的话?)

      好的,来自SOIL website,这段代码告诉了如何加载一个处理透明度的png文件:

      /* load an image file directly as a new OpenGL texture */
       GLuint tex_2d = SOIL_load_OGL_texture
       (
             "img.png"
             SOIL_LOAD_AUTO,
             SOIL_CREATE_NEW_ID,
             SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB |
             SOIL_FLAG_COMPRESS_TO_DXT
       );
      

      【讨论】:

      • 我找到了一个教程网站here,它展示了如何使用 photoshop 在 bmp 图像上添加 alpha 通道。我的 bmps 是 24bpp,所以它上面没有 alpha 通道。我还没有尝试将其转换为 32bpp。另外我发现我的 mipmap 函数没有 RGB + A w/c 的参数是 alpha (RGBA) ,所以我还有很多选择要做。在您的代码示例中,我如何确定图像的尺寸(w,h)? SOIL有自动计算的功能吗?
      • 还如何确定要传递给 gluBuild2DMIPMaps 的最后一个参数的缓冲区的大小?我见过其中一些,但我不明白 unsigned char* data = (unsigned char*) malloc(w * l * 4);并且该数据将被放入 void*(?) 我很困惑的类型。我还需要知道加载图像的所有要求。谢谢
      【解决方案3】:

      在 Photoshop 中可以实现 BMP 透明度,至少 24 位深度。 它不会在 Matlab 中显示为“imwrite”选项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-30
        • 2013-09-15
        • 2011-12-21
        • 1970-01-01
        相关资源
        最近更新 更多