Jump to content
Compvision.ru
Sign in to follow this  
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);


}

Share this post


Link to post
Share on other sites

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

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.

×