16 位灰度的IplImage 转为 Bitmap
mceet 2017-04-12 10:12:57 如题,如何实现。
目前8,24 位图都可以转:代码如下:
HDC hDC = CreateCompatibleDC(0);
if(pImg==NULL)LogMessage("have no image\r\n");
LogMessage("after createCompatibleDC()\r\n");
BYTE tmp[sizeof(BITMAPINFO)+255*4];
BITMAPINFO *bmi = (BITMAPINFO*)tmp;
HBITMAP hBmp;
int i;
memset(bmi,0,sizeof(BITMAPINFO));
bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi->bmiHeader.biWidth = pImg->width;
bmi->bmiHeader.biHeight = pImg->height;
bmi->bmiHeader.biPlanes = 1;
bmi->bmiHeader.biBitCount = pImg->nChannels * pImg->depth;
bmi->bmiHeader.biCompression = BI_RGB;
bmi->bmiHeader.biSizeImage=0;
//bmi->bmiHeader.biSizeImage = pImg->width*pImg->height*pImg->depth*pImg->nChannels/8;
//bmi->bmiHeader.biSizeImage=pImg->widthStep*pImg->height*1;
bmi->bmiHeader.biClrImportant =0 ;
LogMessage("before switch\r\n");
switch(pImg->nChannels * pImg->depth)
{
case 8 :
for(i=0 ; i < 256 ; i++)
{
bmi->bmiColors[i].rgbBlue = i;
bmi->bmiColors[i].rgbGreen= i;
bmi->bmiColors[i].rgbRed= i;
}
break;
case 16:
//bmi->bmiColors[0].
break;
case 32:
case 24:
((DWORD*) bmi->bmiColors)[0] = 0x00FF0000; /* red mask */
((DWORD*) bmi->bmiColors)[1] = 0x0000FF00; /* green mask */
((DWORD*) bmi->bmiColors)[2] = 0x000000FF; /* blue mask */
break;
default:
break;
}
LogMessage("before createCompatibleDC()\r\n");
hBmp = CreateDIBSection(hDC,bmi,DIB_RGB_COLORS,NULL,0,0);
LogMessage("createCompatibleDC()\r\n");
SetDIBits(hDC,hBmp,0,pImg->height,pImg->imageData,bmi,DIB_RGB_COLORS);
// ::DeleteDC(hDC);
DeleteDC(hDC);
LogMessage("HBitmap\r\n");
MySaveBmpTofile(hBmp,"D:\\image2.bmp");
CBitmap *pBitmap=new CBitmap;
pBitmap->Attach(hBmp);
return pBitmap;