Перейти к содержимому
Compvision.ru
mrgloom

картинка на picture control

Recommended Posts

пытаюсь вывести картинку на picture control загружаю через opencv перевожу в DIB

вроде работает, только если свернуть-развернуть программу, то картинка пропадает.

HBITMAP CDibFromIplImage(IplImage* Image)

{

	assert(Image);


	IplImage* imgTemp= 0;


	// Creates IPL image (header and data)

	imgTemp = cvCreateImage(cvGetSize(Image), 8, 3 );


	// If greyscale convert to colour else just make a copy.

	if(1 == Image->nChannels)

	{

		cvCvtColor(Image, imgTemp, CV_GRAY2RGB);

	}

	else

	{

		cvCopy(Image, imgTemp);

	}


	int bpp = imgTemp->nChannels * 8;

	assert(imgTemp->width >= 0 && imgTemp->height >= 0 && (bpp== 8 || bpp == 24 || bpp == 32));


	CvMat dst;

	// Matrix

	void* dst_ptr = 0;


	// Create on the stack

	unsigned char buffer[sizeof(BITMAPINFO) + 255*sizeof

	(RGBQUAD)];


	// The BITMAPINFO structure defines the dimensions and color information for a DIB.

	BITMAPINFO* bmi = (BITMAPINFO*)buffer;


	ZeroMemory(&(bmi->bmiHeader), sizeof(BITMAPINFOHEADER));

	bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

	bmi->bmiHeader.biWidth = imgTemp->width;

	bmi->bmiHeader.biHeight = imgTemp->origin ? abs(imgTemp->height) : -abs(imgTemp->height);

	bmi->bmiHeader.biPlanes = 1;

	bmi->bmiHeader.biBitCount = bpp;

	bmi->bmiHeader.biCompression = BI_RGB;


	if (bpp == 8)

	{

		RGBQUAD* palette = bmi->bmiColors;

		int i;

		for (i = 0; i < 256; i++)

		{

			palette[i].rgbRed = palette[i].rgbGreen =

			palette[i].rgbBlue = (BYTE)i;

			palette[i].rgbReserved = 0;

		}

	}


	HBITMAP hBmp = CreateDIBSection(NULL, bmi, DIB_RGB_COLORS,

	&dst_ptr, 0, 0);

	if(NULL == hBmp)

	{

		DWORD dwError = ::GetLastError();

		// DisplaySystemErrorMsg(_T("CreateDIBSection"));

		return FALSE;

	}

	cvInitMatHeader(&dst, imgTemp->height, imgTemp->width,

	CV_8UC3, dst_ptr, (imgTemp->width * imgTemp->nChannels + 3) & -4);

	cvConvertImage(imgTemp, &dst, imgTemp->origin ?

	CV_CVTIMG_FLIP : 0);

	cvReleaseImage(&imgTemp);

	return hBmp;

}

void CControlDlg::SetPicture()

{

	IplImage* img= cvLoadImage("test_image.tif"); 

	HBITMAP dib_img= CDibFromIplImage(img);

	//по идее тут нету ресайза

	CStatic* frame = (CStatic*)GetDlgItem(IDC_IMAGE_FRAME);

	frame->SetBitmap(dib_img);

	::DeleteObject(dib_img);

	cvReleaseImage(&img);


}

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


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

Точно не скажу, но похоже, что не установлено свойство отключающее перерисовку компонента по умолчанию, или надо использовать Refresh. И вообще, прорисовку компонента (а это таки похоже на прорисовку) надо делать в onPaint.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×