Exemple #1
0
/**
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;
}