科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件VC编程实现灰度图像与彩色图像的相互转换

VC编程实现灰度图像与彩色图像的相互转换

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

工程应用中经常要遇到需要把彩色图像到灰度图像的变换的问题,采集卡过来的图像为彩色图像

作者:刘 涛 来源:yesky 2007年11月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
void CDibView::OnMenuchange() file://图像转换实现函数
{
 // TODO: Add your command handler code here
 HANDLE data1handle;
 LPBITMAPINFOHEADER lpBi;
 BITMAPINFO *m_pBMI;
 CDibDoc *pDoc=GetDocument();
 HDIB hdib;
 unsigned char *hData;
 unsigned char *data;
 hdib=pDoc->GetHDIB();//得到位图数据的句柄,其中包含图像信息头
 BeginWaitCursor();
 lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);
 hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);
 m_pBMI=new BITMAPINFO;//生成彩色图像的信息头
 m_pBMI->bmiHeader.biBitCount=24;
 m_pBMI->bmiHeader.biClrImportant=0;
 m_pBMI->bmiHeader.biClrUsed=0;
 m_pBMI->bmiHeader.biCompression=BI_RGB;
 m_pBMI->bmiHeader.biHeight=lpBi->biHeight;
 m_pBMI->bmiHeader.biWidth=lpBi->biWidth;
 m_pBMI->bmiHeader.biPlanes=1;
 m_pBMI->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
 m_pBMI->bmiHeader.biXPelsPerMeter=0;
 m_pBMI->bmiHeader.biYPelsPerMeter=0;
 m_pBMI->bmiHeader.biSizeImage=WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight*3;
 file://data=hData;
 int R,G,B,i,j;
 data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight*3);
 file://生成存储彩色图象数据的缓冲区
 data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);
 for(i=0;ibiHeight;i++)//实现灰度到彩色变换
  for(j=0;jbiWidth*8);j++)
  {
   if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=64)
   {R=0;
    G=(int)4*(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j));
    B=255;
   }
   if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)>64
    && *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=128)
    {R=0;
     G=255;
     B=(int)4*(128-*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j));
    }
   if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)>128
     && *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=192)
     {R=(int)4*(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)-128);
      G=255;
      B=0;
     }
   if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)>192
     && *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=255)
     {R=255;
      G=(int)4*(255-*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j));
      B=0;
     }
   file://将生成的R、G、B分量存入目标缓冲区
   *(data+i*WIDTHBYTES(lpBi->biWidth*8)*3+j*3)=B;
   *(data+i*WIDTHBYTES(lpBi->biWidth*8)*3+j*3+1)=G;
   *(data+i*WIDTHBYTES(lpBi->biWidth*8)*3+j*3+2)=R;
  }
  GlobalUnlock((HGLOBAL)hdib);
  GlobalUnlock(data1handle);
  EndWaitCursor();
  CClientDC pDC(this);
  file://显示真彩色图像
  StretchDIBits(pDC.GetSafeHdc(),0,0,lpBi->biWidth,lpBi->biHeight,0,0,
         lpBi->biWidth, lpBi->biHeight,data,m_pBMI,DIB_RGB_COLORS,
         SRCCOPY);
  delete m_pBMI;
}


              图 一



              图 二

  数字图像处理技术博大精深,我真诚的希望和广大朋友探讨

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章