我正在尝试使用SDL编程游戏引擎并使用picoPNG作为图像加载器。我试图建立一个系统来设置我的Window类窗口的图标,发生了一些奇怪的事情。看起来这个图标适用于某些图像而且对其他图像没有用。我几乎不知道SDL_Surface是如何工作的,所以我用了一些网站来查找一些信息。 (我无法发布指向他们的链接,因为我只有八分之八的必需信誉)
void Window::setWindowIcon(const std::string& filePath) {
//read file
std::vector<unsigned char> in;
std::vector<unsigned char> out;
unsigned long width, height;
//Use my file loading class to read the image file
if (DPE::IOManager::readFileToBuffer(filePath, in) == false) {
fatalError("Failed to open " + filePath);
}
int errorCode = DPE::decodePNG(out, width, height, &(in[0]), in.size());
if (errorCode != 0) {
fatalError("Failed to decode png file!");
}
Uint32 rmask = 0x000000ff;
Uint32 gmask = 0x0000ff00;
Uint32 bmask = 0x00ff0000;
Uint32 amask = 0xff000000;
_sdlSurface = SDL_CreateRGBSurfaceFrom((void*)&out[0], width, height, 32, width * 4, rmask, gmask, bmask, amask);
if (_sdlSurface == NULL) {
std::cout << SDL_GetError() << std::endl;
fatalError("Failed to create surface!");
}
SDL_SetWindowIcon(_sdlWindow, _sdlSurface);
SDL_FreeSurface(_sdlSurface);
}
最后,这是两个png文件 This one Worked. This one didn't.
通过代码的迭代显示一切都很好,唯一的错误通知是图标没有改变。
修改:我已将颜色遮罩更改为跨端兼容
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
int shift = 0;
rmask = 0xff000000 >> shift;
gmask = 0x00ff0000 >> shift;
bmask = 0x0000ff00 >> shift;
amask = 0x000000ff >> shift;
#else // little endian, like x86
rmask = 0x000000ff;
gmask = 0x0000ff00;
bmask = 0x00ff0000;
amask = 0xff000000;
#endif
答案 0 :(得分:0)
我想我找到了答案。看来,当我使用alpha像素时,它占用了8个bpp,所以我将文件大小减小到75x75并且图像工作。