怎样将320*240的采集的图像转换为176*144方法

文章详细描述了一个视频捕捉类的回调函数,处理YUY2和未压缩的RGB24格式数据,通过ConvDephi函数进行像素切割,并根据不同压缩格式发送到本地或远程显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码只是截取了功能实现部分,具体怎么应用需要根据自己的开发环境来实现。

LRESULT CALLBACK CVideoCapture::VideoStreamCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)

 unsigned char* RGBBuf;
 unsigned char* RGBBufDis;
 CVideoCapture* pCapture=(CVideoCapture*)capGetUserData(hWnd);
 int Wi=pCapture->m_sBitMapInfo.bmiHeader.biWidth;
 int Hi=pCapture->m_sBitMapInfo.bmiHeader.biHeight;


 XL_VIDEO_MSG msg;
 msg.flag=0;
  
 if(pCapture && pCapture->m_bActive)
 {
  CVideoCenter * pVideoCenter=CVideoCenter::getInstance();
  if ( 0x32595559 == pCapture->m_sBitMapInfo.bmiHeader.biCompression )
  {
   // YUY2
   RGBBuf= (unsigned char*)malloc(Hi*Wi*3); //320*240
   pCapture->YUY22RGB24(RGBBuf,lpVHdr->lpData);
   
   RGBBufDis= (unsigned char*)malloc(pCapture->m_nWi*pCapture->m_nHi*3);

   // dephi 320x240 -> 176*144
   pCapture->ConvDephi(RGBBuf,RGBBufDis,Wi,Hi);


   if(pVideoCenter->m_bVideoTransOpen)
   {
    pVideoCenter->m_pVideoTransmit->LocalDataDisplay(RGBBufDis,pCapture->m_nWi*pCapture->m_nHi*3);

//    pVideoCenter->m_pVideoTransmit->SendVideoToRemote(RGBBufDis,pCapture->m_nWi*pCapture->m_nHi*3);

    msg.length=Wi*Hi*3;
    memcpy(msg.buffer,RGBBufDis,msg.length);
    pVideoCenter->m_pMsgHandler->ReportEvent(&msg);

   }
   free(RGBBuf);
   free(RGBBufDis);
  }
  // uncompressed RGB24 (BGR sequence)
  else if ( 0 == pCapture->m_sBitMapInfo.bmiHeader.biCompression && 24 == pCapture->m_sBitMapInfo.bmiHeader.biBitCount)
  {
   // RGB
   RGBBufDis= (unsigned char*)malloc(pCapture->m_nWi*pCapture->m_nHi*3);
   pCapture->ConvDephi(lpVHdr->lpData,RGBBufDis,Wi,Hi);

//   pVideoCenter->m_pVideoTransmit->LocalDataDisplay(lpVHdr->lpData,lpVHdr->dwBytesUsed);

   if(pVideoCenter->m_bVideoTransOpen)
   {
    pVideoCenter->m_pVideoTransmit->LocalDataDisplay(RGBBufDis,pCapture->m_nWi*pCapture->m_nHi*3);
//    pVideoCenter->m_pVideoTransmit->SendVideoToRemote(RGBBufDis,pCapture->m_nWi*pCapture->m_nHi*3);

    msg.length=Wi*Hi*3;
    memcpy(msg.buffer,RGBBufDis,msg.length);
    pVideoCenter->m_pMsgHandler->ReportEvent(&msg);

   }
   free(RGBBufDis);

  }

 }
 return 111;
}

//这个是转换函数,主要算法就是将像素点进行切割。

void CVideoCapture::ConvDephi(unsigned char* source, unsigned char* dest,int srcWi,int srcHi)
{
 int i;
 int j;
 int qWi=(srcWi-m_nWi)/2;
 int qHi=(srcHi-m_nHi)/2;

 for(i=0;i
 {
  for(j=0;j
  {
            *(dest+i*m_nWi*3+j*3) = *(source+(qHi+i)*3*srcWi+(qWi+j)*3); 
            *(dest+i*m_nWi*3+j*3+1) = *(source+(qHi+i)*3*srcWi+(qWi+j)*3+1); 
            *(dest+i*m_nWi*3+j*3+2) = *(source+(qHi+i)*3*srcWi+(qWi+j)*3+2); 
  }
 }
 return;
}

分享:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值