http://www.voidcn.com/article/p-uuoyvzxr-hn.html
- BOOL IplImage2Bmp(HDC dc,IplImage *pImage,CBitmap *bitmap)
- {
- if( pImage && pImage->depth == IPL_DEPTH_8U )
- {
- uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];
- BITMAPINFO* bmi = (BITMAPINFO*)buffer;
- int bmp_w = pImage->width, bmp_h = pImage->height;
- //FillBitmapInfo( bmi, bmp_w, bmp_h, Bpp(), pImage->origin );
- int width=bmp_w;
- int height=bmp_h;
- int bpp=pImage ? (pImage->depth & 255)*pImage->nChannels : 0;
- int origin=pImage->origin;
- HBITMAP hBitmap;
- char* dst_data = 0;
- assert( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32));
- BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);
- memset( bmih, 0, sizeof(*bmih));
- bmih->biSize = sizeof(BITMAPINFOHEADER);
- bmih->biWidth = width;
- bmih->biHeight = origin ? abs(height) : -abs(height);
- bmih->biPlanes = 1;
- bmih->biBitCount = (unsigned short)bpp;
- bmih->biCompression = BI_RGB;
- if( bpp == 8 )
- {
- RGBQUAD* palette = bmi->bmiColors;
- int i;
- for( i = 0; i < 256; i++ )
- {
- palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
- palette[i].rgbReserved = 0;
- }
- }
- if(bitmap->m_hObject!=NULL)
- {
- bitmap->Detach();
- }
- hBitmap=CreateDIBitmap(dc,bmih,CBM_INIT,pImage->imageData,bmi,DIB_RGB_COLORS);
- bitmap->Attach(hBitmap);
- return TRUE;
- }
- return FALSE;
- }