【问题标题】:Displaying an .bmp image in C++/SDL2在 C++/SDL2 中显示 .bmp 图像
【发布时间】:2018-04-23 07:15:32
【问题描述】:

我在 SDL 窗口中显示图像时遇到问题,我不太确定自己做错了什么。代码编译得很好,图像已与我的 .exe 一起放在调试文件夹中,所以我不确定它为什么不显示。有没有我可能遗漏的小事?

#include <iostream>
#include <stdio.h>
#include <SDL.h>
#undef main

using namespace std;

const int screenWidth = 640;
const int screenHeight = 480;

int main(int argc, char* args[]) {

SDL_Window* window = SDL_CreateWindow("Game", SDL_WINDOWPOS_UNDEFINED, 
SDL_WINDOWPOS_UNDEFINED, screenWidth, screenHeight, SDL_WINDOW_SHOWN);
SDL_Surface* image = SDL_LoadBMP("image.bmp");
SDL_Renderer* render = SDL_CreateRenderer(window, -1, 0);
SDL_Texture* texture1 = SDL_CreateTextureFromSurface(render, image);

SDL_RenderCopy(render, texture1, NULL, NULL);
SDL_RenderPresent(render);

SDL_UpdateWindowSurface(window);

SDL_Delay(5000);

SDL_DestroyTexture(texture1);
SDL_DestroyRenderer(render);
SDL_FreeSurface(image);
SDL_DestroyWindow(window);

SDL_Quit();
return 0;
}

【问题讨论】:

  • image 的值是多少?如果为 NULL,SDL_GetError() 说什么?相对路径是相对于当前工作目录的,而不是“.exe 文件夹”,这可能是完全不同的东西。删除SDL_UpdateWindowSurface,因为您已经使用渲染器并且无法将表面与其结合。最后但同样重要的是,至少在窗口事件上进行渲染循环和重绘(或者,更简单,无条件重绘);一次绘画和睡觉不是一种展示事物的方式。
  • 在 Linux 上,您的代码可以正常工作,正如@keltar 所写,SDL_GetError 应该会有所帮助。也许是图像文件格式的东西?
  • 最小可运行的工作 PNG 示例:stackoverflow.com/questions/4153055/… 可能很容易适应 bmp,因为文档说它受支持:libsdl.org/projects/SDL_image/docs/SDL_image.html

标签: c++ sdl-2


【解决方案1】:

如果您在调试器中单步执行代码,并检查 每一步都有返回值,你有没有得到意想不到的东西? 比如空指针。这可能会帮助你 缩小范围。

图像已与我的 .exe 一起放在调试文件夹中

如果您从 IDE 运行,则当前工作文件夹正在运行 成为项目文件夹。

【讨论】:

  • 谢谢!问题是它应该在项目所在的文件夹中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2017-05-09
  • 2014-12-26
  • 2016-12-14
相关资源
最近更新 更多