3

我一直在尝试读取 zip 存档并从中加载 png 图像,但是我收到了来自 SDL_Image 的无效图像格式错误。这是代码

#include <SDL\SDL.h>
#include <SDL\SDL_opengl.h>
#include <SDL\SDL_image.h>

#define ZLIB_WINAPI //to use zlibwapi dll
#include <zlib.h>
#include <zip.h> //minizip
#include <unzip.h> //minizip

#include <string>

SDL_RWops* readfromarchive(std::string archive, std::string filename)
{

unzFile data;
unz_file_info   info;
Uint8*  buffer = NULL;
SDL_RWops* rw = NULL;

data = unzOpen(archive.c_str());
unzLocateFile( data, filename.c_str(), 1 );
unzGetCurrentFileInfo( data, &info, NULL, 0, NULL, 0, NULL, 0 );
unzOpenCurrentFile( data );
buffer = (Uint8*)malloc(info.uncompressed_size);
unzReadCurrentFile( data, buffer, info.uncompressed_size );
rw = SDL_RWFromMem(buffer, info.uncompressed_size);
free(buffer);
unzClose(data);
return rw;
}

当我这样做时

    Surf_Temp = IMG_Load_RW( readfromarchive(archive, filename) , 1);

我收到错误 IMG_Load_RW: %s Unsupported image format 好吧,如果直接从解压缩文件加载,它可以使用 IMG_Load(),在通过 sdl 创建 rwops 结构并加载时也可以使用

    IMG_Load_RW(SDL_RWFromFile(filename.c_str(), "rb"), 1);

所以文件格式很好,所有 zlib 和 minizip 函数都没有返回任何错误,我检查了 info 结构并且数据与我尝试加载的文件一致,所以错误出现在创建 rwops 结构的某个地方。

4

1 回答 1

3

问题如下。您正在使用 SDL 的 RWOPs 结构。在给定的情况下,您想从内存中读取。但是您在阅读之前删除了内存。RWOPs 结构不会复制内存,它需要在读取所有内容之前保持有效。

IMG_Load_RW要解决问题,请在调用到之前将调用拉到free(buffer);

于 2013-03-08T15:29:17.227 回答