freeimage.h

FreeImage_HasPixels

DLL_API BOOL DLL_CALLCONV FreeImage_HasPixels(FIBITMAP *dib);

Devuelve FALSE si el mapa de bits no contiene datos de pixels (es decir, si contiene sólo la cabecera y posiblemente algunos metadatos).

Los mapas de bits con sólo la cebecera se pueden cargar usando el flag FIF_LOAD_NOPIXELS (ver Tabla 3).

Este flag de carga indica al decodificador que lea los datos de cabecera y los metadatos disponibles y que se salte los datos de pixels. El tamaño de la memoria usado por el sib se reduce al tamaño de sus miembros, excluyendo el buffer de pixels. Leer sólo la información de los metadatos es más rápido, ya que no se realiza la decodificación de los pixels.

Los mapas de bits con sólo la cabecera se pueden usar con funciones de información de mapas de bits, e iteradores de metadatos. No se pueden usar con funciones de procesamiento de pixels o por funciones de guardado.

Un plugin puede ser consultado para soporte de "sólo lectura" usando FreeImage_FIFSupportsNoPixels.

BOOL testHeaderData(const char *lpszPathName) {
    int flags = FIF_LOAD_NOPIXELS;
    FIBITMAP *dib = NULL;
    try {
        // load a file using the FIF_LOAD_NOPIXELS flag
        FREE_IMAGE_FORMAT fif = FreeImage_GetFIFFromFilename(lpszPathName);
        assert(FreeImage_FIFSupportsNoPixels(fif) == TRUE);
        dib = FreeImage_Load(fif, lpszPathName, flags);
        if(!dib) throw(1);
        // check that dib does not contains pixels
        BOOL bHasPixel = FreeImage_HasPixels(dib);
        assert(bHasPixel == FALSE);
        // use accessors
        FREE_IMAGE_TYPE type = FreeImage_GetImageType(dib);
        unsigned width = FreeImage_GetWidth(dib);
        unsigned height = FreeImage_GetHeight(dib);
        unsigned bpp = FreeImage_GetBPP(dib);
        // parse some metadata (see e.g. FreeImage_FindFirstMetadata)
        ParseMetadata(dib, FIMD_COMMENTS);
        ParseMetadata(dib, FIMD_EXIF_MAIN);
        ParseMetadata(dib, FIMD_EXIF_EXIF);
        ParseMetadata(dib, FIMD_EXIF_GPS);
        ParseMetadata(dib, FIMD_EXIF_MAKERNOTE);
        ParseMetadata(dib, FIMD_IPTC);
        ParseMetadata(dib, FIMD_XMP);

        // check for a possible embedded thumbnail
        if(FreeImage_GetThumbnail(dib)) {
            // thumbnail is present
            FIBITMAP *thumbnail = FreeImage_GetThumbnail(dib);
        }
        // you cannot access pixels
        BYTE *bits = FreeImage_GetBits(dib);
        assert(bits == NULL);
        FreeImage_Unload(dib);
        return TRUE;
    }
    catch(int) {
        if(dib) FreeImage_Unload(dib);
    }

    return FALSE;
}