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外的其他格式。
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
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
相关文章推荐
- How to load FIBITMAP and convert it to HBITMAP
- Simple-openni:display the depthMap and the imageMap:
- PjConvertImageFormat:用FreeImage.NET写的一个35种图像格式转换程序
- convert image to base64 and post to RESTful wcf
- A Codebook-Free and Annotation-Free Approach for Fine-Grained Image Categorization(精读)
- LIBGDX: FreeTypeFontGenerator and BitmapTrueFont
- Convert between cv::Mat and QImage 两种图片类转换
- convert between PIL Image and ndarray
- Image-based Lighting approaches and parallax-corrected cubemap
- Convert URL to image with Python and OpenCV(根据URL下载图片)
- Volume Rendering using CUDA – Trilinear Interp. and Image Color-Map
- Spring(6)-Spring Collections (List, Set, Map, and Properties) example
- service structure flowchart [mobile to server via HTTP RESTful API and TCP/IP in a map]
- 笔记:Deep multi patch aggregation network for image style, aesthetics and quality estimation
- 图像编程的好帮手-四大图像库:OpenCV/FreeImage/CImg/CxImage
- ImageMagick and OS X Mountain Lion trouble 10.8
- Jquery Image Zoom and Draggable Test
- Imagic Photo - Image And Photo Enhancement Software
- /proc/sys/vm/max_map_count耗尽时,调用glibc 2.11.3 free()导致程序crash,问题追踪和解决