Freeimage.h

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);
}