相信每一个在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) ; } } } //================================================================
|