SDL_image 无法使用 IMG_LoadTexture() 加载 .png 文件
SDL_image Can't load .png file with IMG_LoadTexture()
尝试使用 IMG_LoadTexture(渲染器,"idle.png")加载 .png 文件时
SDL_GetError() 说:"Couldn't open idle.png"
没有编译器错误,只是出现黑色 window。
这是我的main.cpp
#include <stdlib.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <iostream>
int main(int argc, char** argv) {
SDL_Event event;
SDL_Renderer *renderer = NULL;
SDL_Texture *texture = NULL;
SDL_Window *window = NULL;
SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO);
SDL_CreateWindowAndRenderer(
800, 600,
0, &window, &renderer
);
IMG_Init(IMG_INIT_PNG);
texture = IMG_LoadTexture(renderer, "idle.png");
std::cout << SDL_GetError();
while (1) {
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
break;
}
SDL_DestroyTexture(texture);
IMG_Quit();
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return EXIT_SUCCESS;
}
但我想问题是我link图书馆的方式。我安装了 sdl2、sdl2_image 和 libpng。
CMakeLists.txt:
cmake_minimum_required(VERSION 3.12)
project(untitled)
set(CMAKE_CXX_STANDARD 17)
add_executable(untitled main.cpp)
INCLUDE(FindPkgConfig)
PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
PKG_SEARCH_MODULE(SDL2IMAGE REQUIRED SDL2_image>=2.0.0)
INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${SDL2IMAGE_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(untitled ${SDL2_LIBRARIES} ${SDL2IMAGE_LIBRARIES})
您正在从应用程序的当前工作目录 (CWD) 加载图像。那是 不一定 与您的可执行文件所在的目录相同(这取决于它的启动方式),您似乎假设了这一点。
3 种简单的修复方法:
- 在运行时将 cwd 更改为文件所在的位置,然后像现在一样加载。
- 加载时提供文件的绝对路径,因此 cwd 无关紧要。
- 在运行时获取可执行文件的路径,然后构造一个相对于可执行文件所在位置的文件路径。 (我认为最好的选择,因为它可以防止将项目 around/installing 移动到其他位置)。
尝试使用 IMG_LoadTexture(渲染器,"idle.png")加载 .png 文件时 SDL_GetError() 说:"Couldn't open idle.png" 没有编译器错误,只是出现黑色 window。
这是我的main.cpp
#include <stdlib.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <iostream>
int main(int argc, char** argv) {
SDL_Event event;
SDL_Renderer *renderer = NULL;
SDL_Texture *texture = NULL;
SDL_Window *window = NULL;
SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO);
SDL_CreateWindowAndRenderer(
800, 600,
0, &window, &renderer
);
IMG_Init(IMG_INIT_PNG);
texture = IMG_LoadTexture(renderer, "idle.png");
std::cout << SDL_GetError();
while (1) {
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
break;
}
SDL_DestroyTexture(texture);
IMG_Quit();
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return EXIT_SUCCESS;
}
但我想问题是我link图书馆的方式。我安装了 sdl2、sdl2_image 和 libpng。
CMakeLists.txt:
cmake_minimum_required(VERSION 3.12)
project(untitled)
set(CMAKE_CXX_STANDARD 17)
add_executable(untitled main.cpp)
INCLUDE(FindPkgConfig)
PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
PKG_SEARCH_MODULE(SDL2IMAGE REQUIRED SDL2_image>=2.0.0)
INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS} ${SDL2IMAGE_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(untitled ${SDL2_LIBRARIES} ${SDL2IMAGE_LIBRARIES})
您正在从应用程序的当前工作目录 (CWD) 加载图像。那是 不一定 与您的可执行文件所在的目录相同(这取决于它的启动方式),您似乎假设了这一点。
3 种简单的修复方法:
- 在运行时将 cwd 更改为文件所在的位置,然后像现在一样加载。
- 加载时提供文件的绝对路径,因此 cwd 无关紧要。
- 在运行时获取可执行文件的路径,然后构造一个相对于可执行文件所在位置的文件路径。 (我认为最好的选择,因为它可以防止将项目 around/installing 移动到其他位置)。