您的位置:首页 > 其它

MFC上显示摄像头JPEG图片数据的两种方法

2015-12-31 16:36 351 查看
  其一是借助opencv,其二是利用流对象。

方法一:

CvMat *mat;                                        //创建矩阵
mat = cvCreateMat(640,480,CV_8UC1);                //指定分配内存大小
cvInitMatHeader(mat,640,480,CV_8UC1,JPEGBuf);     
/*初始化矩阵信息头,这里的JPEGBuf就是JPEG图像数据的地址。现在很多摄像头是支持JPEG输出的,而且JPEG图像输出节                                                    省宽带。640*480大小的图片大小仅在20K以内。网上提到的什么视频采集卡,提供的SDK也基本提供JPEG数据,它获得的数                                                    据就是图像数据,而不是图像文件。*/
IplImage *pIplImage = cvDecodeImage(mat,CV_LOAD_IMAGE_COLOR);  //这里将JPEG图像数组转化为IplImage类,这里自动包含了解压JPEG格式图片功能。
if(pIplImage != NULL)   //如果解压失败得到的是NULL
{
  CvvImage cimg;      //CvvImage类在opencv 2.2以后没有CvvImage类了,网上搜索这个类,有低版本的源代码,直接添加到工程里就可以用了。
  cimg.CopyOf( pIplImage);   //复制图像
  cimg.DrawToHDC(pMainDlg->m_DispHDC, &pMainDlg->m_DispRECT);  //显示图像
  cvReleaseImage(&pIplImage);//释放图像
}
cvReleaseMat(&mat);  //释放矩阵


  下面这个是个学习资料。  

  利用opencv读取图片并在MFC上显示,链接地址:http://licong1018.blog.163.com/blog/static/9026978420129239178934/

方法二:

void CTestDlg::DisplayJPEG(HDC hDC,unsigned char *buf,UINT bufLen,int rectWidth,int rectHeight)
{
HGLOBAL hImageMemory=GlobalAlloc(GMEM_MOVEABLE, bufLen);//给图片分配全局内存
void *pImageMemory=GlobalLock(hImageMemory);            //锁定内存
if(pImageMemory == NULL)
{
TRACE("can't Get Global Memory!\n");
goto ret;
}
memcpy(pImageMemory,buf,bufLen);                        //读取图片到全局内存当中
GlobalUnlock(hImageMemory);                             //解锁内存

IStream *pIStream;                                        //创建一个IStream接口指针,用来保存图片流
IPicture *pIPicture;                                      //创建一个IPicture接口指针,表示图片对象
CreateStreamOnHGlobal(hImageMemory, false,&pIStream);     //用全局内存初使化IStream接口指针
OleLoadPicture(pIStream, 0, false, IID_IPicture,(LPVOID*)&(pIPicture));//用OleLoadPicture获得IPicture接口指针
if(pIStream == NULL)
{
TRACE("can't Get pIStream!\n");
goto ret;
}

OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;

if(pIPicture == NULL)
{
TRACE("can't Get Picture Info!\n");
goto ret;
}

pIPicture->get_Width(&hmWidth);  //用接口方法获得图片的宽和高
pIPicture->get_Height(&hmHeight);
pIPicture->Render(hDC,0,0,rectWidth,rectHeight,0,hmHeight,hmWidth,-hmHeight,NULL);//在指定的DC上绘出图片

//以下代码为了保存一张图片
///////////////////////////////////////////////////////////////////////////////////
if(m_bSavePic == TRUE)
{
m_SaveFile.Open("Hello.jpg",CFile::modeCreate|CFile::modeWrite);           //读写方式打开
m_SaveFile.Seek(0,CFile::begin);
m_SaveFile.Write(buf,bufLen);                                             //将文件读入缓存
m_SaveFile.Close();
m_bSavePic = FALSE;
}
///////////////////////////////////////////////////////////////////////////////////

pIStream->Release(); //释放pIStream
pIPicture->Release(); //释放pIPicture
ret:
GlobalFree(hImageMemory); //释放全局内存
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: