从内存中检索图像数据

时间:2011-06-24 02:57:12

标签: c++ freeimage

我正在使用FreeImage库来处理加载图像并将它们传递给OpenGL。目前,我支持从文件中读取图像。但是,我想将其扩展为能够从变量中读取游戏内容包的目的。基本上,简而言之,我将整个文件,标题和所有内容写入unsigned char *。我想拿这个缓冲区并用它做类似的事情(假设变量fif被声明):

  FIBITMAP * dib = FreeImage_Load(fif, "someImage.png");

但不是someImage.png,我想指定unsigned char *(为了问题,我们调用它缓冲区)。库中有一个方法可以处理这样的事情吗?

编辑:我应该更具体一点,因为“someImage.png”可以被视为无符号字符*。

要清除混淆,如果有的话,unsigned char * buffer的值将由类似这样的伪代码确定:

  fileStream = openFile "someImage.png"
  unsigned char * buffer = fileStream.ReadToEnd

2 个答案:

答案 0 :(得分:5)

听起来你想使用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);

答案 1 :(得分:0)

使用FreeImage_LoadFromHandle。您需要创建3个可以访问缓冲区的函数,并将这些函数的地址放在FreeImageIO结构中。