Jump to content
Compvision.ru
Sign in to follow this  
Smorodov

Улучшенная функция Ipl2Bmp

Recommended Posts

Корректно выводит изображения ширины не кратной 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]

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×