Извлечение данных изображения из памяти - PullRequest
2 голосов
/ 24 июня 2011

Я использую библиотеку FreeImage для загрузки изображений и передачи их в OpenGL.В настоящее время у меня есть поддержка для чтения изображения из файла.Тем не менее, я хотел бы расширить это, чтобы иметь возможность чтения из переменной для целей пакетов игрового контента.Короче говоря, у меня есть весь файл, заголовок и все, записанные в беззнаковый символ *.Я хочу взять этот буфер и сделать с ним что-то похожее (предположим, объявлена ​​переменная fif):

  FIBITMAP * dib = FreeImage_Load(fif, "someImage.png");

, но вместо someImage.png я хочу указать unsigned char * (давайте вызовем егобуфер ради вопроса).Есть ли в библиотеке метод, который может обрабатывать такие вещи?

РЕДАКТИРОВАТЬ: я должен быть более конкретным, учитывая, что "someImage.png" можно считать без знака char *.

ToЕсли нет, значение буфера unsigned char * будет определяться примерно так: psuedo code:

  fileStream = openFile "someImage.png"
  unsigned char * buffer = fileStream.ReadToEnd

Ответы [ 2 ]

5 голосов
/ 24 июня 2011

Похоже, вы хотите использовать FreeImage_ConvertToRawBits.Вот пример из документации:

   // this code assumes there is a bitmap loaded and
   // present in a variable called ‘dib’
   // convert a bitmap to a 32-bit raw buffer (top-left pixel first)
   // --------------------------------------------------------------
   FIBITMAP *src = FreeImage_ConvertTo32Bits(dib);
   FreeImage_Unload(dib);
   // Allocate a raw buffer
   int width = FreeImage_GetWidth(src);
   int height = FreeImage_GetHeight(src);
   int scan_width = FreeImage_GetPitch(src);
   BYTE *bits = (BYTE*)malloc(height * scan_width);
   // convert the bitmap to raw bits (top-left pixel first)
   FreeImage_ConvertToRawBits(bits, src, scan_width, 32, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, TRUE);
   FreeImage_Unload(src);
   // convert a 32-bit raw buffer (top-left pixel first) to a FIBITMAP
   // ----------------------------------------------------------------
   FIBITMAP *dst = FreeImage_ConvertFromRawBits(bits, width, height, scan_width, 32, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, FALSE);
0 голосов
/ 24 июня 2011

Используйте FreeImage_LoadFromHandle. Вам нужно создать 3 функции, которые могут обращаться к буферу, и поместить адреса этих функций в структуру FreeImageIO.

...