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

时间:2015-06-28 18:12:25

标签: c opengl-es android-ndk freeimage

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

1 个答案:

答案 0 :(得分:3)

FreeImage实际上并不需要使用BGR(A)排序。部分"像素访问功能"在FreeImage documentation中包含以下语句(强调我的):

  

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

     

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

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

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