mrgloom 242 Жалоба Опубликовано June 18, 2012 пытаюсь вывести картинку на 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); } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано June 18, 2012 Точно не скажу, но похоже, что не установлено свойство отключающее перерисовку компонента по умолчанию, или надо использовать Refresh. И вообще, прорисовку компонента (а это таки похоже на прорисовку) надо делать в onPaint. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах