我正在使用FreeImage库来处理加载图像并将其传递给OpenGL。目前,我支持从文件中读取图像。然而,我想将其扩展到能够从变量中读取游戏内容包。简而言之,基本上,我将整个文件、头和所有内容都写入到一个无符号的char*中。我想用这个缓冲区做一些类似的事情(假设变量fif被声明):
FIBITMAP * dib = FreeImage_Load(fif, "someImage.png");
但我想指定无符号的char*,而不是someImage.png(为了方便起见,我们将其称为buffer)。图书馆里有没有一种方法可以处理这样的事情?
编辑:考虑到"someImage.png"可以被认为是一个无符号的char*,我应该更具体一点。
为了消除混淆(如果有的话),无符号char*缓冲区的值将由类似于以下psuedo代码的东西确定:
fileStream = openFile "someImage.png"
unsigned char * buffer = fileStream.ReadToEnd
听起来你想使用FreeImage_ConvertToRawBits。以下是文档中的一个示例:
// this code assumes there is a bitmap loaded and
// present in a variable called ‘dib’
// convert a bitmap to a 32-bit raw buffer (top-left pixel first)
// --------------------------------------------------------------
FIBITMAP *src = FreeImage_ConvertTo32Bits(dib);
FreeImage_Unload(dib);
// Allocate a raw buffer
int width = FreeImage_GetWidth(src);
int height = FreeImage_GetHeight(src);
int scan_width = FreeImage_GetPitch(src);
BYTE *bits = (BYTE*)malloc(height * scan_width);
// convert the bitmap to raw bits (top-left pixel first)
FreeImage_ConvertToRawBits(bits, src, scan_width, 32, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, TRUE);
FreeImage_Unload(src);
// convert a 32-bit raw buffer (top-left pixel first) to a FIBITMAP
// ----------------------------------------------------------------
FIBITMAP *dst = FreeImage_ConvertFromRawBits(bits, width, height, scan_width, 32, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, FALSE);
使用FreeImage_LoadFromHandle
。您需要创建3个可以访问缓冲区的函数,并将这些函数的地址放在FreeImageIO结构中。