我使用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_ );
答案 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)很可能是这类平台上的原生数据格式,因此使用这种格式代表了传输图像数据的最有效方式。