我在对一副灰度位图先二值化(0和255),再进行一些处理后,将有用点象素的灰度用128表示,现在我想将这些点染成红色,该如何进行?谢谢各位。希望各位给我代码,谢谢!

解决方案 »

  1.   

    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;
    }
      

  2.   

    转换公式为Gray(i,j)=0.11*R(i,j)+0.59*G(i,j)+0.3*B(i,j)
      

  3.   

    参考:
    http://www.yesky.com/422/1714422.shtml
      

  4.   

    谢谢!
    但是我原图是一个灰度位图可以直接对它进行RGB的赋值吗?
      

  5.   

    如果是8位灰度图是不可以的,你无论如何赋值他都不会是红色的,如果是24位灰度图是可以直接赋值的.24位就是不用调色板,把你的RGB三位都直接赋值为8位灰度里面相应的灰度值,这样你如果想将相应的点赋值为红色的话,可以将R=255,G=B=0就可以了.
      

  6.   

    这个只能用pdc->SetPixel(i,j,RGB(255,0,0));了.i,j就是对应你图像中像素的坐标,这该会了吧.不过这样刷新一下就会没有了.想刷新还有可以用双缓冲.这个你可以search一下以前的贴子.讲这个的多了.8位灰度图像修改调色板也不能将其设置为红色.我一般省事就把8位灰度图转为24位灰度图用.不过8位的好操作.