为啥 SDL 程序不显示 BMP 图片?

Posted

技术标签:

【中文标题】为啥 SDL 程序不显示 BMP 图片?【英文标题】:Why does SDL program not show BMP picture?为什么 SDL 程序不显示 BMP 图片? 【发布时间】:2012-05-24 15:29:20 【问题描述】:

我从Lazy 得到以下代码:

#include <iostream>
#include "SDL/SDL.h"

using namespace std;

int main()

    //Start SDL
    SDL_Init(SDL_INIT_EVERYTHING);

    SDL_Surface *hello = NULL;
    SDL_Surface *screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);

    hello = SDL_LoadBMP("hello.bmp");
    SDL_BlitSurface(hello, NULL, screen, NULL);
    SDL_Flip(screen);
    SDL_Delay(3000);
    SDL_FreeSurface(hello);

    //Quit SDL
    SDL_Quit();
    return 0;

有时会显示图片,但大多数时候它只是一个黑色窗口(带有此图片的细线)。我在同一个目录中有名为“hello.bmp”的 BMP 文件。 PS.我有 ArchLinux。

【问题讨论】:

【参考方案1】:

在显示您的图像之前,您应该将其转换为与您选择的视频模式兼容的格式。 因此你应该实现这样的东西:

SDL_Surface *imagef;
imagef = SDL_DisplayFormat(image);

在对 BMP 进行 blit 之前,并使用 imagef 进行所有操作。

【讨论】:

谢谢!你是对的。但它会发生吗。教程中没有它的迹象。 我不知道那个教程。我根据我的知识回答。你所说的“它发生了”是什么意思?而且,如果我的答案是您想要的,请您接受吗? 当然,没问题)但我不明白为什么它在大多数情况下没有格式化就可以工作(我已经用谷歌搜索了它并看到了很多类似问题的答案:“它有效正确地在我的电脑上”)。 我不太清楚。我认为 - 虽然这只是我的赌注 - 因为 SDL_DisplayFormat 将信息(例如像素格式)从帧缓冲区复制到新表面,并且这些信息基于所使用的监视器,所以这是一个依赖于硬件的问题。由于我不知道 SDL 函数如何填充像素格式结构的成员(以及颜色),我不能说有时 SDL_LoadBMP 是否将 BMP 转换为与显示器有点兼容的表面(无需转换它)。我尽量保持简单。 不客气。然而,考虑到这只是我的赌注,不要认为这是理所当然的。

以上是关于为啥 SDL 程序不显示 BMP 图片?的主要内容,如果未能解决你的问题,请参考以下文章

SDL 显示图片

用 SDL2 显示一张图片

OpenGL程序不显示任何图片

秒懂音视频开发22_显示YUV图片

C#中的g.DrawImage问题,请教一下,为啥ShowPic()不显示图片?

用 SDL2 平铺背景并显示前景