* 函数名称: 
* GrayStrech() 
* 
* 参数: 
* LPSTR  lpDIBBits  -指向原DIB图像的指针 
* LONG  lWidth        -原图像的宽度(像素) 
* LONG  lHeight  -原图像的高度(像素) 
* BYTE  bX1  -灰度拉伸第一个点的X坐标 
* BYTE  bY1  -灰度拉伸第一个点的Y坐标 
* BYTE  bX2  -灰度拉伸第二个点的X坐标 
* BYTE  bY2  -灰度拉伸第二个点的Y坐标 
* 
* 返回值: 
* BOOL    -成功则返回TRUE,否则返回FALSE 
* 
* 说明: 
* 该函数用来对图像进行灰度拉伸,改善输出图像 
* 
*************************************************************************/ 

BOOL WINAPI GrayStrech(LPSTR lpDIBBits,LONG lWidth,LONG lHeight,BYTE bX1, 
        BYTE bY1,BYTE bX2,BYTE bY2) 

unsigned 
char *lpSrc; //指向原图像的指针 
LONG i,j; //循环变量 
BYTE bMap[256];  //灰度映射表 
LONG lLineBytes; //图像每行的字节数 

lLineBytes 
= WIDTHBYTES(lWidth*8); //计算图像每行的字节数 
//计算灰度映射表 
for (i = 0;i <= bX1;i++)
  
//判断bX1是否大于0(防止分母为0) 
  if (bX1 > 0
  
//线性变换 
  bMap[i] = (BYTE) bY1*i/bX1; 
  }
 
  
else 
  
//直接置0 
  bMap[i] = 0
  }
 

}
 
for (;i <= bX2;i++)
  
//判断bX1是否等于bX2(防止分母为0) 
  if (bX2 != bX1) 
  
//线性变换 
  bMap[i] = bY1 + (BYTE)((bY2 - bY1)*(i - bX1)/(bX2 - bX1)); 
  }
 
  
else 
  
//直接置为bY1 
  bMap[1= bY1; 
  }
 
}
 
for (;i < 256;i++
  
//判断bX2是否等于255(防止分母为0) 
  if (bX2 != 255)
  
//线性变换 
  bMap[i] = bY2 + (BYTE)((255 - bY2)*(i - bX2)/(255 - bX2)); 
  }
 
  
else 
  
//直接置为255 
  bMap[i] = 255
  }
 
}
 
//每行 
for (i = 0;i < lHeight;i++)
  
//每列 
  for (j = 0;j < lWidth;j++
  
//指向DIB第i行第j个像素 指针 
  lpSrc = (unsigned char*)lpDIBBits + lLineBytes*(lHeight - 1 - i) + j; 
  
//计算新的灰度值 
  *lpSrc = bMap[*lpSrc]; 
  }
 
}
 

return TRUE; 
}