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

C 为什么FreeImage以BGR格式加载图像?,c,opengl-es,android-ndk,freeimage,C,Opengl Es,Android Ndk,Freeimage,我使用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 (F

我使用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_ );

FreeImage实际上不必使用BGR(A)排序。中的“像素访问功能”部分包含以下语句(强调):

但是,此型号使用的像素布局取决于操作系统。使用逐字节内存 为了标记像素布局,FreeImage在一个小范围内使用BGR[a]像素布局 Endian处理器(Windows、Linux)并在Big Endian处理器(Mac OS X或任何Big Endian Linux/Unix)下使用RGB[a]像素布局。这个选择是为了方便使用 使用图形API创建FreeImage

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

但是,当您想要使用FreeImage的原始像素数据作为OpenGL的源时,这些宏将不会帮助您


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

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

LOCAL_CPPFLAGS += -DFREEIMAGE_COLORORDER=FREEIMAGE_COLORORDER_RGB
如果您搜索FreeImage\u COLORORDER,可在Source/FreeImage.h中找到相关文档:

颜色顺序:

指定的颜色组件顺序(红色、绿色和蓝色)将影响 FIT_位图类型的24位和32位图像以及 是调色板的一部分。所有其他图像始终使用RGB顺序。通过 默认情况下,颜色顺序与endianness耦合:

小端点->BGR

大端->RGB

但是,您始终可以将FREEIMAGE_COLORORDER定义为以下任意一种颜色: 已知顺序FREEIMAGE\u COLORORDER\u BGR(0)和FREEIMAGE\u COLORORDER\u RGB (1) 指定您的首选颜色顺序


你如何判断更改RGB顺序的是FreeImage?我使用类型为GL_RGB的glTexImage2D,图像显示的颜色不正确,当我设置类型为GL_BGR时,图像显示的颜色正确一对问题:1)使用其他工具显示图像是否正确?2) 你的计算机架构是大端还是小端。强烈建议张贴相关代码。类型?你是说?@user3629249我编辑了这个问题。你可以看到代码。我在使用Opengl ES的android应用程序中使用freeimage,因为我知道Opengl ES不支持BGR(A)顺序。哦,它确实不支持。可能有一些选择:a)完全删除freeimage。b) 在CPU上手动重新排列通道(c)在着色器中应用纹理时只需旋转通道。我不喜欢这些选项,但我没有其他选项。无论如何,谢谢你的回答。