FreeImage_LoadFromHandle
FreeImage tiene la característica única de cargar mapas de bits desde cualquier fuente arbitraria. Esta fuente puede ser, por ejemplo, un fichero, un fichero zip o un stream de Internet. El manejo de estas fuentes arbitrarias no es manipulado directamente en FREEIMAGE.DLL, pero puede ser fácilmente añadido usando una estructura FreeImageIO definida en freeimage.h.
FreeImageIO es una estructura que contiene cuatro punteros a funciones: una para leer desde una fuente, otra para escribir en la fuente, una tercera para buscar y otra para indicar en qué punto de la fuente nos encontramos. Cuando se completa la estructura FreeImageIO con punteros a funciones y se pasa la estructura a FreeImage_LoadFromHandle, FreeImage invocará a tus funciones para leer, buscar e indicar posiciones en un fichero. El parámetro manipulador (tercer parámetro desde la izquierda) se usa para diferenciar entre diferentes contextos, por ejemplo, diferentes ficheros o distintos streams de Internet.
Sintaxis
DLL_API FIBITMAP *DLL_CALLCONV FreeImage_LoadFromHandle(FREE_IMAGE_FORMAT fif, FreeImageIO *io, fi_handle handle, int flags FI_DEFAULT(0));
Parámetros
fif: Define el tipo de mapa de bits a cargar.
io: Puntero a una estructura FreeImageIO.
handle: Manipulador de la fuente de origen.
flags: Flags opcionales. (Ver FreeImage_Load).
Valor de retorno
Esta función retorna un FIBITMAP.
Observaciones
Los punteros de función en FreeImageIO usan la convención de llamada stdcall. Esto implica que las funciones apuntadas deben usar esa convención. Esta convención se eligió pra ser compatible con otros lenguajes de programación distintos a C++, como Visual Basic.
FreeImageIO io; io.read_proc = ReadProc; // pointer to function that calls fread io.write_proc = NULL; // not needed for loading io.seek_proc = SeekProc; // pointer to function that calls fseek io.tell_proc = TellProc; // pointer to function that calls ftell FILE *f = fopen(“mybitmap.bmp”, “rb”); FIBITMAP *bitmap = FreeImage_LoadFromHandle(FIF_BMP, &io, (fi_handle)f, 0); fclose(f); if (bitmap) { // bitmap successfully loaded! FreeImage_Unload(bitmap); }