仅对8位,24位图像进行灰度处理

来源:互联网 发布:数控折弯机如何编程 编辑:程序博客网 时间:2024/04/25 20:55

//仅对8位,24位图像进行灰度处理
void CDib::Gray()
{
 long linebits;
 
 unsigned char bitCount=GetBitCount();//在此得到位数
    
 if(bitCount==24)
 {
  //计算相应的 8 位图大小
  unsigned long dwFileSize = sizeof(BITMAPFILEHEADER) + m_pBitmapInfoHeader->biSize
   + 256 * sizeof(RGBQUAD) + WIDTHBYTES(m_nWidth*8) * m_nHeight;
  
  //写 BITMAPFILEHEADER
  BITMAPFILEHEADER bfh;
  memcpy(&bfh,m_pBitmapFileHeader,sizeof(BITMAPFILEHEADER));
  bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + m_pBitmapInfoHeader->biSize
   + 256 * sizeof(RGBQUAD);
  bfh.bfSize = dwFileSize;
  m_fileLeng = dwFileSize;
  //写 BITMAPINFOHEADER
  BITMAPINFOHEADER bih;
  memcpy(&bih,m_pBitmapInfoHeader,m_pBitmapInfoHeader->biSize);
  bih.biBitCount = 8;
  bih.biSizeImage = (unsigned long)WIDTHBYTES(m_nWidth*8) * (unsigned long)m_nHeight;
  bih.biClrUsed = 256;
  
  //写 RGBQUAD
  RGBQUAD rgbq[256];
  for(int i=0;i<256;i++)
  {
   rgbq[i].rgbRed=i;
   rgbq[i].rgbGreen=i;
   rgbq[i].rgbBlue=i;
   rgbq[i].rgbReserved=0;
  }
  
  //写位图数据
  unsigned char* pData = new unsigned char[bih.biSizeImage];
  long lw=WIDTHBYTES(m_nWidth*24);
  linebits = WIDTHBYTES(m_nWidth*8);
  
  for(long j=0l;j<m_nHeight;j++)
  {
   for(long i=0l;i<m_nWidth;i++)
   {
    long jj=j*lw;
    long ii=3*i;
    unsigned char gray = (unsigned char)(0.299*(m_pDibData[jj+ii])+
     0.587*(m_pDibData[jj+ii+1])+0.114*(m_pDibData[jj+ii+2])+0.5);
    pData[j*linebits+i] = gray;    
   }
  }
  //重新申请内存文件 
  
  if( m_pFileData != NULL )
   delete [] m_pFileData;
  m_pFileData = new BYTE [m_fileLeng];//这个是新的bmp的文件指针啊。
  
  memcpy(m_pFileData,&bfh,sizeof(BITMAPFILEHEADER) );//fileheader
  memcpy(m_pFileData+sizeof(BITMAPFILEHEADER),&bih,sizeof(BITMAPINFOHEADER) );//infoheader
  memcpy(m_pFileData+54,rgbq,256*sizeof(RGBQUAD) );//rgbquad
  memcpy(m_pFileData+1078,pData,bih.biSizeImage);//象素信息

  
 }

原创粉丝点击