freeimage.h

FreeImage_LoadMultiBitmapFromMemory

DLL_API FIMULTIBITMAP *DLL_CALLCONV
FreeImage_LoadMultiBitmapFromMemory(FREE_IMAGE_FORMAT fif, FIMEMORY *stream, int flags
FI_DEFAULT(0));

Abre un mapa de bits multipágina desde un canal de memoria.

Esta función es similar a FreeImage_OpenMultiBitmap, con la diferencia de que será posible abrir un fichero multipágina, en modo de sólo lectura, desde un canal de memoria en lugar de desde un fichero.

El primer parámetro indica a FreeImage el tipo de mapa de bits a abrir. Actualmente están soportados FIF_TIFF, FIF_ICO y FIF_GIF. El segundo parámetro indica a FreeImage el canal de memoria que ha de decodificar. EL último parámetro se usa para modificar el comportamiento o activar alguna característica del plugin de mapa de bits. Cada plugin tiene su propio conjunto de parámetros.

Aunque el manipulador de memoria de entrada se abre en modo de sólo lectura, usando esta función, los manipuladores de memoria multipágina soportan operaciones de lectura o lectura/escritura. Cuando se modifica un fichero multipágina usando funciones como FreeImage_AppendPage, FreeImage_InsertPage, FreeImage_MovePage o FreeImage_DeletePage, los cambios se almacenan de forma transparente en un caché de memoria de modo que esos cambios pueden ser guardados más tarde a un canal de salida. El canal de memoria de entrada permanece sin modidicar: cerrar el canal de entrada no lo modificará. Se podrá usar entonces algún tipo de función “guardar como…” para guardar los cambios.

static BOOL
extractPagesFromMemory(FREE_IMAGE_FORMAT fif, FIMEMORY *stream) {
    char filename[256];
    // open the multipage bitmap stream as read-only
    FIMULTIBITMAP *src = FreeImage_LoadMultiBitmapFromMemory(fif, stream, 0);
    if(src) {
        // get the page count
        int count = FreeImage_GetPageCount(src);
        // extract all pages
        for(int page = 0; page < count; page++) {
            // load the bitmap at position 'page'
            FIBITMAP *dib = FreeImage_LockPage(src, page);
            if(dib) {
                // save the page
                sprintf(filename, "page%d.%s", page, FreeImage_GetFormatFromFIF(fif));
                FreeImage_Save(fif, dib, filename, 0);
                // Unload the bitmap (do not apply any change to src)
                FreeImage_UnlockPage(src, dib, FALSE);
            } else {
                // an error occured: free the multipage bitmap handle and return
                FreeImage_CloseMultiBitmap(src, 0);
                return FALSE;
            }
        }
    }
    // make sure to close the multipage bitmap handle on exit
    return FreeImage_CloseMultiBitmap(src, 0);
}
void testLoadMultiBitmapFromMemory(const char *lpszPathName) {
    struct stat buf;
    int result;
    // get data associated with lpszPathName
    result = stat(lpszPathName, &buf);
    if(result == 0) {
        // allocate a memory buffer and load temporary data
        BYTE *mem_buffer = (BYTE*)malloc(buf.st_size * sizeof(BYTE));
        if(mem_buffer) {
            FILE *stream = fopen(lpszPathName, "rb");
            if(stream) {
                fread(mem_buffer, sizeof(BYTE), buf.st_size, stream);
                fclose(stream);
                // attach the binary data to a memory stream
                FIMEMORY *hmem = FreeImage_OpenMemory(mem_buffer, buf.st_size);
                // get the file type
                FREE_IMAGE_FORMAT fif = FreeImage_GetFileTypeFromMemory(hmem, 0);
                // extract pages
                BOOL bSuccess = extractPagesFromMemory(fif, hmem);
                assert(bSuccess);

                // close the stream
                FreeImage_CloseMemory(hmem);
            }
        }
        // user is responsible for freeing the data
        free(mem_buffer);
    }
}