您的位置:首页 > 其它

FreeImage Convert Btween FIBITMAP and HBITMAP

2017-08-29 20:42 429 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: