Smorodov 579 Жалоба Опубликовано June 16, 2009 Корректно выводит изображения ширины не кратной 8 и изображения с типом элемента не IPL_DEPTH_8U. Думаю что должен выводить любые изображения. #define WIDTHBYTES(bits) ((((bits) + 31) / 32) * 4) //--------------------------------------------------------------------------- // Создание API шного битмапа из интеловского RGB изображения //--------------------------------------------------------------------------- HBITMAP CreateRGBBitmap(IplImage* _Grab) { char *App; IplImage *_Grab3=0,*_Grabf=0; LPBITMAPINFO lpbi = new BITMAPINFO; lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); lpbi->bmiHeader.biWidth = _Grab->width; lpbi->bmiHeader.biHeight =_Grab->height; lpbi->bmiHeader.biPlanes = 1; lpbi->bmiHeader.biBitCount = 24; lpbi->bmiHeader.biCompression = BI_RGB; lpbi->bmiHeader.biSizeImage = WIDTHBYTES((DWORD)_Grab->width * 8) * _Grab->height; lpbi->bmiHeader.biXPelsPerMeter = 0; lpbi->bmiHeader.biYPelsPerMeter = 0; lpbi->bmiHeader.biClrUsed = 0; lpbi->bmiHeader.biClrImportant = 0; void* pBits; HBITMAP hBitmap = CreateDIBSection( NULL, lpbi, DIB_RGB_COLORS, (void **)&pBits, NULL, 0 ); delete lpbi; if ( hBitmap ) App=(char*)pBits; // Если глубина изображения не IPL_DEPTH_8U (однобайтовое целое), конвертируем if(_Grab->depth!=IPL_DEPTH_8U) { _Grabf=cvCloneImage(_Grab); if(_Grab) {cvReleaseImage( &_Grab);} _Grab = cvCreateImage( cvSize(_Grabf->width,_Grabf->height),IPL_DEPTH_8U,_Grabf->nChannels); cvConvert(_Grabf,_Grab); if(_Grabf) {cvReleaseImage( &_Grabf);} } // Если изображение содержит один канал, создаем трехканальное изображение // Серое или бинарное if(_Grab->nChannels==1) { _Grab3 = cvCreateImage( cvSize(_Grab->width,_Grab->height),IPL_DEPTH_8U,3); cvMerge(_Grab,_Grab,_Grab,NULL,_Grab3); } // Если входное изображение трехканальное, просто копируем указатель на него // Цветное if(_Grab->nChannels==3) { _Grab3=_Grab; } // Получаем указатель на данные unsigned char* data; cvGetRawData(_Grab3, (uchar**)&data); // Копируем данные if(_Grab3) { for (int i=0;i<_Grab->height;i++) { memcpy(App+_Grab3->widthStep*(_Grab3->height-i-1),data+_Grab3->widthStep*i,_Grab3->width*3); } } // Очищаем память если создавали изображение, а не копировали указатель if(_Grab->nChannels==1) {cvReleaseImage( &_Grab3);} return hBitmap; } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // Функция вывода изображения на HANDLE оконного компонента //--------------------------------------------------------------------------- void APIDrawIpl(int x,int y,IplImage* _Grab,void *HANDLE) { HDC hMemDC,hDC; hDC=GetDC(HANDLE); hMemDC = CreateCompatibleDC(hDC); HBITMAP Bitmap=CreateRGBBitmap(_Grab); SelectObject(hMemDC,Bitmap); BitBlt(hDC,x,y,_Grab->width,_Grab->height,hMemDC,0,0,SRCCOPY); DeleteObject(Bitmap); DeleteDC(hMemDC); DeleteDC(hDC); } //--------------------------------------------------------------------------- //---------------------------------------------------------------------------[/code] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах