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

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

编辑

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

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_ ); 

FreeImage实际上并不一定使用BGR(A)排序。 FreeImage文档中的“像素访问函数”部分包含以下语句(强调我的):

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

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

但是,当您想要将FreeImage的原始像素数据用作OpenGL的源时,这些宏将无法帮助您。

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

FreeImage可以构建为始终以RGB顺序加载,而与架构无关。 使用#define FREEIMAGE_COLORORDER = FREEIMAGE_COLORORDER_RGB。 如果您使用Android.mk构建FreeImage,请向其添加以下行:

 LOCAL_CPPFLAGS += -DFREEIMAGE_COLORORDER=FREEIMAGE_COLORORDER_RGB 

如果您搜索FREEIMAGE_COLORORDER,可以在Source / FreeImage.h中找到此文档:

颜色顺序:

红色,绿色和蓝色的指定颜色分量顺序会影响FIT_BITMAP类型的24位和32位图像以及作为调色板一部分的颜色。 所有其他图像始终使用RGB顺序。 默认情况下,颜色顺序与字节顺序相关联:

little-endian – > BGR

big-endian – > RGB

但是,您始终可以将FREEIMAGE_COLORORDER定义为任何已知订单FREEIMAGE_COLORORDER_BGR(0)和FREEIMAGE_COLORORDER_RGB(1)以指定首选颜色顺序。