为什么 FreeImage 以 BGR 格式加载图像?

hak*_*ist 2 c opengl-es freeimage android-ndk

我使用 Android NDK 和 FreeImage 库编写游戏以将图像加载到我的游戏中。它以 BGR 格式加载图像。可以以RGB格式加载吗?或者我需要手动交换 R 和 B 组件?

已编辑

我的设备是三星 Galaxy S4(armv7 架构)。这是代码`

FIMEMORY* fiStream = FreeImage_OpenMemory((BYTE*)data, size);
FREE_IMAGE_FORMAT fif = FreeImage_GetFileTypeFromMemory(fiStream);
if (FreeImage_FIFSupportsReading(fif))
{
    dib = FreeImage_LoadFromMemory(fif, fiStream, 0);
}

if (!dib)
    return;

data_ = FreeImage_GetBits(dib);
width_ = FreeImage_GetWidth(dib);
height_ = FreeImage_GetHeight(dib);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width_, height_, 0, GL_RGB, GL_UNSIGNED_BYTE, data_ );
Run Code Online (Sandbox Code Playgroud)

der*_*ass 5

FreeImage 实际上并不一定使用 BGR(A) 排序。FreeImage 文档中的“像素访问功能”部分包含以下声明(重点是我的):

但是,此模型使用的像素布局取决于操作系统。使用逐字节内存顺序标记像素布局,然后 FreeImage 在 Little Endian 处理器(Windows、Linux)下使用 BGR[A] 像素布局,在 Big Endian 处理器(Mac OS)下使用 RGB[A] 像素布局X 或任何 Big Endian Linux / Unix)。做出此选择是为了简化 FreeImage 与图形 API 的使用。

然而,这种细微的差异对用户来说是透明的。为了使像素访问操作系统独立,FreeImage 定义了一组宏,用于在 24 或 32 位 DIB 中设置或获取单个颜色分量。

但是,当您想使用 FreeImage 的原始像素数据作为 OpenGL 的源时,这些宏将无济于事。

但我不知道你的问题是什么。OpenGL 将接受 BGR(A) 和 RGB(A) 作为图像数据。实际上,FreeImage 的选择也不错,因为 BGR(A) 很可能是此类平台上的原生数据格式,因此使用这种格式代表了传输图像数据的最有效方式。