当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

c++开发中数据结构和算法的分离

    相信每一个在windows下编过程序的人都或多或少地用过位图,大多数人是从网上下载一些成熟完善的dib类库来使用(例如cximage、cdib),少数人有一套自己封装好的dib类库,方便以后的扩充和使用。(近几年gdi+异军突起,在某些处理方面,如:缩放、旋转、渐变填充等它提供无与伦比的速度和质量,但,如果你想做一个完善的图像处理程序,直接使用它会给架构设计带来困难,你可以用adapter模式封装它后再使用)。

    这时候,如果你需要一些图像处理操作你会怎么办呢?很多没有oo经验的c++程序员(例如一年前的我)可能会这样做:在类中直接添加方法。

 //================================================================
int fclamp0255 (int nvalue) {return max (0, min (0xff, nvalue));} // 饱和到0--255

class fcobjimage
{
 public :
  invert () ;
  adjustrgb (int r, int g, int b) ;
} ;
//================================================================
void fcobjimage::invert ()
{
 if ((gethandle() == null) (colorbits() < 24))
  return ;

 int nspan = colorbits() / 8 ; // 每象素字节数3, 4
 for (int y=0 ; y < height() ; y++)
 {
  byte * ppixel = getbits (y) ;
  for (int x=0 ; x < width() ; x++, ppixel += nspan)
  {
   ppixel[0] = ~ppixel[0] ;
   ppixel[1] = ~ppixel[1] ;
   ppixel[2] = ~ppixel[2] ;
  }
 }
}
//================================================================
void fcobjimage::adjustrgb (int r, int g, int b)
{
 if ((gethandle() == null) (colorbits() < 24))
  return ;

 int nspan = colorbits() / 8 ; // 每象素字节数3, 4
 for (int y=0 ; y < height() ; y++)
 {
  byte * ppixel = getbits (y) ;
  for (int x=0 ; x < width() ; x++, ppixel += nspan)
  {
   ppixel[0] = fclamp0255 (ppixel[0] + b) ;
   ppixel[1] = fclamp0255 (ppixel[1] + g) ;
   ppixel[2] = fclamp0255 (ppixel[2] + r) ;
  }
 }
}
//================================================================

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接