freeimage.h

FreeImage_SaveMultiBitmapToMemory

DLL_API BOOL DLL_CALLCONV FreeImage_SaveMultiBitmapToMemory(FREE_IMAGE_FORMAT fif,
FIMULTIBITMAP *bitmap, FIMEMORY *stream, int flags);

Guarda un mapa de bits multipágina en el manipulador de memoria especificado. El manipulador debe ser asignado en la posición correcta antes de llamar a la función.

BOOL testSaveMultiBitmapToMemory(const char *input, const char *output, int
output_flag) {
    BOOL bSuccess;
    BOOL bCreateNew = FALSE;
    BOOL bReadOnly = TRUE;
    BOOL bMemoryCache = TRUE;
    // Open src file (read-only, use memory cache)
    FREE_IMAGE_FORMAT fif = FreeImage_GetFileType(input);
    FIMULTIBITMAP *src = FreeImage_OpenMultiBitmap(fif, input, bCreateNew, bReadOnly,
        bMemoryCache);
    if(src) {
        // open and allocate a memory stream
        FIMEMORY *dst_memory = FreeImage_OpenMemory();

        // save the file to memory
        bSuccess = FreeImage_SaveMultiBitmapToMemory(fif, src, dst_memory, output_flag);
        assert(bSuccess);
        // src is no longer needed: close and free src file
        FreeImage_CloseMultiBitmap(src, 0);
        // get the buffer from the memory stream
        BYTE *mem_buffer = NULL;
        DWORD size_in_bytes = 0;
        bSuccess = FreeImage_AcquireMemory(dst_memory, &mem_buffer, &size_in_bytes);
        assert(bSuccess);
        // save the buffer in a file stream
        FILE *stream = fopen(output, "wb");
        if(stream) {
            fwrite(mem_buffer, sizeof(BYTE), size_in_bytes, stream);
            fclose(stream);
        }

        // close and free the memory stream
        FreeImage_CloseMemory(dst_memory);

        return TRUE;
    }
    return FALSE;
}

El siguiente ejemplo muestra como modificar un canal de memoria de entrada y guardar las modificaciones en un canal de memoria de salida. El canal de entrada se deja sin modificar: todas las modificaciones son almacenadas en un caché; ese caché es entonces usado para aplicar las modificaciones al guardar.

static BOOL
loadBuffer(const char *lpszPathName, BYTE **buffer, DWORD *length) {
    struct stat file_info;
    int result;
    // get data associated with lpszPathName
    result = stat(lpszPathName, &file_info);
    if(result == 0) {
        // allocate a memory buffer and load temporary data
        *buffer = (BYTE*)malloc(file_info.st_size * sizeof(BYTE));
        if(*buffer) {
            FILE *stream = fopen(lpszPathName, "rb");
            if(stream) {
                *length = (DWORD)fread(*buffer, sizeof(BYTE), file_info.st_size, stream);
                fclose(stream);

                return TRUE;
            }
        }
    }
    return FALSE;
}
BOOL testMemoryStreamMultiPageOpenSave(const char *lpszPathName, char *output, int input_flag, int output_flag) {
    BOOL bSuccess = FALSE;
    BYTE *buffer = NULL;
    DWORD buffer_size = 0;
    // load source stream as a buffer, i.e.
    // allocate a memory buffer and load temporary data
    bSuccess = loadBuffer(lpszPathName, &buffer, &buffer_size);
    assert(bSuccess);
    // attach the binary data to a memory stream
    FIMEMORY *src_stream = FreeImage_OpenMemory(buffer, buffer_size);
    assert(src_stream);
    // open the multipage bitmap stream
    FREE_IMAGE_FORMAT fif = FreeImage_GetFileTypeFromMemory(src_stream, 0);
    FIMULTIBITMAP *src = FreeImage_LoadMultiBitmapFromMemory(fif, src_stream, input_flag);
    // apply some modifications (everything being stored to the cache) ...
    if(src) {
        // get the page count
        int count = FreeImage_GetPageCount(src);
        assert(count > 2);
        // Load the bitmap at position '2'
        FIBITMAP *dib = FreeImage_LockPage(src, 2);
        if(dib) {
            FreeImage_Invert(dib);
            // Unload the bitmap (apply change to src, modifications are stored to the
            cache)
            FreeImage_UnlockPage(src, dib, TRUE);
        }
        // delete page 0 (modifications are stored to the cache)
        FreeImage_DeletePage(src, 0);
        // insert a new page at position '0' (modifications are stored to the cache)
        FIBITMAP *page = createZonePlateImage(512, 512, 128);
        FreeImage_InsertPage(src, 0, page);
        FreeImage_Unload(page);
    }
    // save the modification into the output stream ...
    if(src) {
        // open and allocate a memory stream
        FIMEMORY *dst_stream = FreeImage_OpenMemory();
        assert(dst_stream);
        // save the file to memory
        FreeImage_SaveMultiBitmapToMemory(fif, src, dst_stream, output_flag);
        // src is no longer needed
        // close and free the memory stream
        FreeImage_CloseMemory(src_stream);
        // close and free src file (nothing is done, the cache is cleared)
            FreeImage_CloseMultiBitmap(src, 0);
        // at this point, the input buffer is no longer needed
        // !!! user is responsible for freeing the initial source buffer !!!
        free(buffer); buffer = NULL;

        // get the dst buffer from the memory stream
        BYTE *dst_buffer = NULL;
        DWORD size_in_bytes = 0;

        FreeImage_AcquireMemory(dst_stream, &dst_buffer, &size_in_bytes);

        // save the buffer in a file stream
        FILE *stream = fopen(output, "wb");
        if(stream) {
            fwrite(dst_buffer, sizeof(BYTE), size_in_bytes, stream);
            fclose(stream);
        }

        // close and free the memory stream
        FreeImage_CloseMemory(dst_stream);
        return TRUE;
    }
    if(buffer) {
        free(buffer);
    }
    return FALSE;
}