2015-06-28 6 views
1

Я пишу игру, используя Android NDK и FreeImage, чтобы загружать изображения в мою игру. Он загружает изображения в формате BGR. Можно загрузить в формате RGB? Или мне нужно поменять местами R и B вручную?Почему FreeImage загружает изображение в формате BGR?

Edited

Мой аппарат Samsung 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

Как вы определяете, что это FreeImage, который изменяет ваш заказ RGB? – usr2564301

+0

Я использую glTexImage2D с типом = GL_RGB, и изображение появляется в неправильных цветах, когда я устанавливаю тип = GL_BGR, он отображается в правильных цветах – haksist

+0

пару вопросов: 1) правильно ли изображение отображается с помощью какой-либо другой утилиты для его отображения? 2) это компьютерная архитектура Big Endian или Little Endian. настоятельно рекомендуем опубликовать соответствующий код. – user3629249

ответ

3

FreeImage фактически не требует использования BGR (A). Раздел «Функция доступа Pixel» в FreeImage documentation содержит следующее заявление (курсив мой):

Однако, расположение пикселей, используемое эту модель ОС зависит. Использование байта памяти байта для обозначения расположения пикселей, тогда FreeImage использует макет пикселя BGR [A] под небольшим процессором Endian (Windows, Linux) и использует макет пикселя RGB [A] под процессором Big Endian (Mac OS X или любой Big Endian Linux/Unix). Этот выбор был сделан для облегчения использования FreeImage с графическим API.

Эта тонкая разница, однако, прозрачна для пользователя. Чтобы сделать доступ к пикселям OS независимым, FreeImage определяет набор макросов, используемых для установки или получения отдельных цветов компонентов в 24- или 32-разрядном DIB.

Однако эти макросы не помогут вам, если вы хотите использовать необработанные пиксельные данные FreeImage в качестве источника для OpenGL.

Но я не знаю, какова ваша проблема с этим. OpenGL будет принимать BGR (A), а также RGB (A) в качестве данных изображения. И на самом деле выбор FreeImage неплох, поскольку BGR (A), скорее всего, является собственным форматом данных на таких платформах, поэтому использование этого формата представляет собой наиболее эффективный способ передачи данных изображения.

+0

Я использую freeimage в приложении Android, который использует Opengl ES, так как я знаю, что Opengl ES не поддерживает BGR (A). – haksist

+0

О, это действительно не так. Могут быть некоторые варианты: а) вообще отказаться от удаления. б) переупорядочить каналы на ЦПУ вручную; c) просто подбирать каналы при применении текстур в шейдерах. – derhass

+0

Мне не нравятся эти параметры, но у меня их нет. В любом случае, спасибо за ваш ответ. – haksist

1

FreeImage может быть построен для постоянной загрузки в режиме RGB независимо от архитектуры. Используйте #define FREEIMAGE_COLORORDER = FREEIMAGE_COLORORDER_RGB. Если вы используете Android.mk построить FreeImage, добавьте следующую строку к нему:

LOCAL_CPPFLAGS += -DFREEIMAGE_COLORORDER=FREEIMAGE_COLORORDER_RGB 

Документация для этого можно найти в Source/FreeImage.h, если вы ищете FREEIMAGE_COLORORDER:

Color-Order:

указанный порядок цветовых компонентов красного, зеленого и синего цветов влияет 24- и 32-битные изображения типа FIT_BITMAP, а также цвета, которые являются частью цветовой палитры. Все остальные изображения всегда используют порядок RGB. По умолчанию, заказ цвета связан с порядком байтов:

прямой порядок байтов -> BGR

большой обратный порядок байт -> RGB

Однако, вы всегда можете определить FREEIMAGE_COLORORDER любой из известных заказов FREEIMAGE_COLORORDER_BGR (0) и FREEIMAGE_COLORORDER_RGB (1), чтобы указать предпочтительный заказ цвета.

 Смежные вопросы

  • Нет связанных вопросов^_^