mfc窗口显示图片

第一天做了一个这个东西(OPENCV实现):


首先左边可以显示图片,在选择不同的图片后,通过抓图按钮将图片保存在右边的小窗口中。

今天解决一个图片显示自适应窗口的问题:

一般我们新建一个图片时,需要赋给图片长宽的大小,那么是不是可以将窗口的长宽赋给图片呢,答案是肯定。

首先,我们要得到窗口的句柄: 

CRect   r_Show; 
 GetDlgItem(ID)->GetClientRect(r_Show);

其中ID是窗口的ID号(窗口右键属性会有显示)

然后,取得长和宽:

 int  Widthpos=r_Show.Width(); 
 int   heightpos=r_Show.Height();

将它们赋给图像就可以了

IplImage *img=0;
CvSize dst_cvsize;   

dst_cvsize.width = Widthpos;
dst_cvsize.height = heightpos;
img = cvCreateImage( dst_cvsize, src->depth, src->nChannels);

最开始一看到句柄,我会很害怕,后来才慢慢感觉到,这东西真有用!

下面是我们显示图片的函数代码(仅供学习参考):

//myShowMFC(IplImage *src, CDC *pDC,UINT ID)第一个参数是待显示的图片,
//第二个参数是窗口的句柄,第三个参数是显示图片的控件的ID
void CExamineeyeDlg::myShowMFC(IplImage *src, CDC *pDC, UINT ID)
{
 CRect   r_Show; 
 GetDlgItem(ID)->GetClientRect(r_Show); //得到图片显示控件的句柄
 int   xpos=r_Show.left; 
 int   ypos=r_Show.top; 
 int   Widthpos=r_Show.Width(); 
 int   heightpos=r_Show.Height();

 IplImage *img=0;
 CvSize dst_cvsize;   //目标图像尺寸
 dst_cvsize.width = Widthpos;
 dst_cvsize.height = heightpos;
 img = cvCreateImage( dst_cvsize, src->depth, src->nChannels); //构造目标图象 
 cvResize(src, img, CV_INTER_LINEAR); //缩放源图像到目标图像
 //src=cvCloneImage(img);
 DWORD height=img->height;
 DWORD width=img->width;
 DWORD lineBytes=(width*8+31)/32*4;
 DWORD lineBytes24=(width*24+31)/32*4;
 BYTE*temp=new BYTE[img->height*lineBytes24];
 if(!temp)return;
 memset(temp,0,height*lineBytes24);
 WORD bitCount;
 if(img->nChannels==1)
 {
  bitCount=8;
 }
 else if(img->nChannels==3)
 {
  bitCount=24;
 }
 else
 {
  delete[]temp;
  temp=NULL;
  return;
 }
 if(bitCount==8)
 {
  for(int i=0;i<img->height;i++)
  {
   for(int j=0,n=0;j<img->width*3;j++,n++)
   {
    *(temp+lineBytes24*(height-1-i)+j)=(BYTE)((uchar*)(img->imageData+img->widthStep*i))[n];
    j++;
    *(temp+lineBytes24*(height-1-i)+j)=(BYTE)((uchar*)(img->imageData+img->widthStep*i))[n];
    j++;
    *(temp+lineBytes24*(height-1-i)+j)=(BYTE)((uchar*)(img->imageData+img->widthStep*i))[n];
   }
  }
 }
 else
 {
  for(int i=0;i<img->height;i++)
  {
   for(int j=0,n=0;j<img->width*3;j++,n++)
   {
    *(temp+lineBytes24*(height-1-i)+j)=(BYTE)((uchar*)(img->imageData+img->widthStep*i))[3*n];
    j++;
    *(temp+lineBytes24*(height-1-i)+j)=(BYTE)((uchar*)(img->imageData+img->widthStep*i))[3*n+1];
    j++;
    *(temp+lineBytes24*(height-1-i)+j)=(BYTE)((uchar*)(img->imageData+img->widthStep*i))[3*n+2];
   }
  }
 }
 BITMAPINFO bi;
 bi.bmiHeader.biBitCount=24;
 bi.bmiHeader.biClrImportant=0;
 bi.bmiHeader.biClrUsed=0;
 bi.bmiHeader.biCompression=0L;
 bi.bmiHeader.biHeight=height;
 bi.bmiHeader.biPlanes=1;
 bi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
 bi.bmiHeader.biSizeImage=height*lineBytes;
 bi.bmiHeader.biWidth=width;
 bi.bmiHeader.biXPelsPerMeter=0;
 bi.bmiHeader.biYPelsPerMeter=0;
 StretchDIBits(pDC->m_hDC,0,0,width,height,0,0,width,height,temp,(BITMAPINFO*)&bi,DIB_RGB_COLORS,SRCCOPY);
 cvReleaseImage(&img);
 delete[]temp;
 temp=NULL;
}

 

阅读更多
换一批

没有更多推荐了,返回首页