Перейти к содержимому
Compvision.ru
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]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×