/** Set the preview image using the dib embedded thumbnail */ static BOOL SetPreviewImage(FIBITMAP *dib, Imf::Header& header) { if(!FreeImage_GetThumbnail(dib)) { return FALSE; } FIBITMAP* thumbnail = FreeImage_GetThumbnail(dib); if((FreeImage_GetImageType(thumbnail) != FIT_BITMAP) || (FreeImage_GetBPP(thumbnail) != 32)) { // invalid thumbnail - ignore it FreeImage_OutputMessageProc(s_format_id, FI_MSG_WARNING_INVALID_THUMBNAIL); } else { const unsigned thWidth = FreeImage_GetWidth(thumbnail); const unsigned thHeight = FreeImage_GetHeight(thumbnail); Imf::PreviewImage preview(thWidth, thHeight); // copy thumbnail to 32-bit RGBA preview image const BYTE* src_line = FreeImage_GetScanLine(thumbnail, thHeight - 1); Imf::PreviewRgba* dst_line = preview.pixels(); const unsigned srcPitch = FreeImage_GetPitch(thumbnail); for (unsigned y = 0; y < thHeight; y++) { const RGBQUAD* src_pixel = (RGBQUAD*)src_line; Imf::PreviewRgba* dst_pixel = dst_line; for(unsigned x = 0; x < thWidth; x++) { dst_pixel->r = src_pixel->rgbRed; dst_pixel->g = src_pixel->rgbGreen; dst_pixel->b = src_pixel->rgbBlue; dst_pixel->a = src_pixel->rgbReserved; src_pixel++; dst_pixel++; } src_line -= srcPitch; dst_line += thWidth; } header.setPreviewImage(preview); } return TRUE; }