【问题标题】:Retrieving image data from memory从内存中检索图像数据
【发布时间】:2011-06-24 11:20:05
【问题描述】:

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

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

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

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

为了消除混淆(如果有的话),unsigned char * buffer 的值将由类似以下伪代码的东西确定:

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

【问题讨论】:

    标签: c++ freeimage


    【解决方案1】:

    听起来您想使用 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!
    • 抱歉,您能解释一下 pitch 参数的具体作用吗?我从文档中不太了解,可能是因为我真的不知道扫描线是什么。
    • Pitch 是图像每行的字节数。出于对齐和性能原因,它通常被填充为比图像的宽度大一点。如果你的图片是紧凑的,它只会是每像素的宽度*字节数。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 2011-03-21
      相关资源
      最近更新 更多