我建了一个当文档应用程序,在View类中定义了几个变量BITMAP bmp;
 int m_nWidth;  //存储位图的宽的数据成员
 int m_nHeight; //存储位图高的数据成员
 double m_dHrate;//位图高的比例因子
 double m_dWrate;位图宽的比例因子
 CBitmap m_Bitmap; //位图对象
写了如下一个函数想对256色图像进行灰度处理,打开bmp图像函数已经写好void CBTTMAPView::OnBmp256ToGray() 
{
 // TODO: Add your command handler code here
 CDC *pDC=this->GetDC(); //获得设备上下文
 //CRect m_rect;
 //this->GetClientRect(&m_rect);  //获得窗口客户区
  COLORREF m_color;
 BYTE r,g,b;
 DWORD m_gray;
 for(int i=0;i<(int)(m_nWidth*m_dWrate);i++)
  for(int j=0;j<(int)(m_nHeight*m_dHrate);j++)
  {
    m_color=pDC->GetPixel(i,j); //获得颜色
   r=GetRValue(m_color);
   g=GetGValue(m_color);
   b=GetBValue(m_color);
    m_gray=(int)(0.38*r+0.49*g+0.1*b);//设置灰度颜色值
   m_color=RGB(m_gray,m_gray,m_gray);
   pDC->SetPixel(i,j,m_color);  //用灰度颜色画点
 
 
   }
  InvalidateRect(NULL); 
}
);发现循环利用GetPixel和SetPixel函数获取和设置像素点,得到的灰度处理结果非常慢,如何通过Dib和调色板进行处理呢,让灰度处理更快,希望高手指点指点。

解决方案 »

  1.   

    郁闷啊,这么久了一个回帖的人有没有,还好,这个问题我好像基本懂了,
    一个解决办法就是开辟一个缓冲区,不必用Dib设备无关位图了。
      

  2.   

    没人回帖很正常,一是你给的分太少了,二是你的意思我们都不怎么明白,你表述的不清楚。
    其实你这个问题很简单,你是不是连最基本的BMP文件格式都不懂啊?你完全可以不用什么GetPixel和SetPiexl函数啊,对于BMP格式的文件,现在处理的都是Dib格式的,也就是与设备无关,如果你选的是图片是真彩色那么一个像素占3个字节,RGB各占一个字节,这样的话,BMP文件格式是这样的,先是信息头,接着是每个像素的RGB值,然后你可以逐个读取各个像素的RGB值就可以了,如果不是真彩色,那么中间还多了一个颜色索引表。
    不讲了,太多了,你可以到百度文库里去搜索  《VC数字图像处理编程讲座》这个Word文档看,看完你就什么都明白了,如果你找不到,就去我空间留个邮箱给我,我明天传你就是了。
      

  3.   

    谢谢哈,最近用Dib类处理图像,感觉方便多了!