FreeImage_MakeThumbnail
1 4 8 16 24 32 16UINT16 48RGB16 64RGBA16 32FLOAT 96RGBF 128RGBAF
DLL_API FIBITMAP *DLL_CALLCONV FreeImage_MakeThumbnail(FIBITMAP *dib, int max_pixel_size, BOOL convert FI_DEFAULT(TRUE));
Crea una miniatura a partir de una imagen en escala de grises o RGB(A) de modo que la imagen de salida entre dentro de un cuadrado del tamaño max_pixel_size, manteniendo la relación de aspecto.
El submuestreo se realiza usando un filtro bilineal (ver FreeImage_Rescale). Un mapa de bits RGB de 16-bit se devuelven como de 24-bit. Los mapas de bits con paleta y los de 4-bit se devuelven como de 8-bit o como de 32-bit si contienen transparencia.
Cuando el parámetro convert es TRUE, las imágenes de alto rango dinámico (FIT_UINT16, FIT_RGB16, FIT_RGBA16, FIT_FLOAT) se convierten de forma transparente a imágenes estándar (es decir, imágenes 8-, 24 o 32-bit), usando una de las funciones de conversión FreeImage_ConvertToXXX.
En cuanto a las imágenes RBG[A]F images, son convertidas a 24-bit usando la función FreeImage_TmoDrago03 con las opciones por defecto.
#define THUMBNAIL_SIZE 90 // fit inside a square whose size is 90 pixels FIBITMAP * makeThumbnail(const char *szPathName) { FIBITMAP *dib = NULL; int flags = 0; // default load flag int originalWidth = 0; // original image width int originalHeight = 0; // original image height FREE_IMAGE_FORMAT fif = FreeImage_GetFileType(szPathName); if(fif == FIF_UNKNOWN) return NULL; if(fif == FIF_JPEG) { FITAG *tag = NULL; // for JPEG images, we can speedup the loading part // using LibJPEG downsampling feature while loading the image... flags |= THUMBNAIL_SIZE << 16; // load the dib dib = FreeImage_Load(fif, szPathName, flags); if(!dib) return NULL; // the dib may have been downscaled by 2x, 4x or 8x // retrieve the original width & height (stored as comments for this special case) if(FreeImage_GetMetadata(FIMD_COMMENTS, dib, "OriginalJPEGWidth", &tag)) { originalWidth = atoi( (char*)FreeImage_GetTagValue(tag) ); } else { originalWidth = FreeImage_GetWidth(dib); } if(FreeImage_GetMetadata(FIMD_COMMENTS, dib, "OriginalJPEGHeight", &tag)) { originalHeight = atoi( (char*)FreeImage_GetTagValue(tag) ); } else { originalHeight = FreeImage_GetHeight(dib); } } else { // any cases other than the JPEG case: load the dib ... if(fif == FIF_RAW) { // ... except for RAW images, try to load the embedded JPEG preview // or default to RGB 24-bit ... flag = RAW_PREVIEW; } dib = FreeImage_Load(fif, szPathName, flags); if(!dib) return NULL; originalWidth = FreeImage_GetWidth(dib); originalHeight = FreeImage_GetHeight(dib); } // store ‘originalWidth’ and ‘originalHeight’ for later use … // store any other metadata (such as Exif) for later use … // ... // create the requested thumbnail FIBITMAP *thumbnail = FreeImage_MakeThumbnail(dib, THUMBNAIL_SIZE, TRUE); FreeImage_Unload(dib); return thumbnail; }