FreeImage Convert Btween FIBITMAP and HBITMAP

FreeImage的官方FAQ中提及了,FIBITMAP与HBITMAP的转换,在这里做一下搬运工

FIBITMAP* FImageTool::ConvertHbimapToFibitmap(HBITMAP hbmp)
{
    FIBITMAP *dib = NULL;
    if(hbmp) {
        BITMAP bm = { 0 };
        int ret = GetObject(hbmp, sizeof(BITMAP), (LPSTR)&bm);
        if (ret == 0 || ret > sizeof(BITMAP)) return NULL;
        dib = FreeImage_AllocateT(FIT_BITMAP, bm.bmWidth, bm.bmHeight, bm.bmBitsPixel);
        if (dib == nullptr) return nullptr;
        int nColors = FreeImage_GetColorsUsed(dib);
        HDC dc = GetDC(NULL);
        int Success = GetDIBits(dc, hbmp, 0, FreeImage_GetHeight(dib),
            FreeImage_GetBits(dib), FreeImage_GetInfo(dib), DIB_RGB_COLORS);
        ReleaseDC(NULL, dc);
        FreeImage_GetInfoHeader(dib)->biClrUsed = nColors;
        FreeImage_GetInfoHeader(dib)->biClrImportant = nColors;
    }
    return dib;
}



HBITMAP FImageTool::ConvertFibitmapToHbitmap(FIBITMAP* dib)
{
    if (dib == nullptr) return nullptr;
    HDC hDC = GetDC(NULL);
    HBITMAP bitmap = CreateDIBitmap(hDC, FreeImage_GetInfoHeader(dib),
        CBM_INIT, FreeImage_GetBits(dib), FreeImage_GetInfo(dib), DIB_RGB_COLORS);
    ReleaseDC(NULL, hDC);
    return bitmap;   
}

但是当时看文档时忽略了后面的内容,导致在经过一次HBITMAP的中间转换后,即便是原先的JPEG格式也无法保存为除BMP外的其他格式。

Why can't I save this image as JPEG ?

First, make sure to use FreeImage_SetOutputMessage to see what's going on inside the JPEG plugin.

Next, the JPEG specification only allows 8-bit greyscale, 24-bit RGB and 32-bit CMYK images to be saved as JPEG. Thus, you cannot save a 32-bit RGBA image to JPEG, nor a 1- or 4-bit palettized images. As for 8-bit palettized images, if you try to save one of them as JPEG, it will be transparently converted to 24-bit by FreeImage.

只有 8-bit greyscale,24位的RGB与32位的CMYK图片才能被保存为JPEG,否则需要FreeImage_ConvertTo24Bits转换。在此记录一下。



http://freeimage.sourceforge.net/faq.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值