【问题标题】:Why FreeImage loads image in BGR format?为什么 FreeImage 以 BGR 格式加载图像?
【发布时间】:2015-06-28 18:12:24
【问题描述】:

我使用 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 改变了你的 RGB 顺序?
  • 我将 glTexImage2D 与 type=GL_RGB 一起使用,图像以错误的颜色显示,当我设置 type=GL_BGR 时,它以正确的颜色显示
  • 几个问题:1) 使用其他实用程序显示图像是否正确显示? 2)你的计算机架构是Big Endian还是Little Endian。强烈建议贴出相关代码。
  • 类型?你不是说format吗?
  • @user3629249 我编辑了这个问题。可以看代码。

标签: c opengl-es android-ndk freeimage


【解决方案1】:

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。

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

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

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

【讨论】:

  • 我在使用 Opengl ES 的 android 应用程序中使用 freeimage,因为我知道 Opengl ES 不支持 BGR(A) 顺序。
  • 哦,确实没有。可能有一些选择:a)完全放弃freeimage。 b) 手动重新排序 CPU 上的通道 c) 在着色器中应用纹理时只需调整通道即可。
  • 我不喜欢这些选项,但我没有其他选项。不管怎样,谢谢你的回答。
【解决方案2】:

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 顺序。经过 默认情况下,颜色顺序与字节序耦合:

小端 -> BGR

大端 -> RGB

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2015-02-16
    • 1970-01-01
    • 2015-08-28
    • 2022-01-11
    相关资源
    最近更新 更多