Chinaunix首页 | 论坛 | 博客
  • 博客访问: 292797
  • 博文数量: 109
  • 博客积分: 2116
  • 博客等级: 大尉
  • 技术积分: 1062
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-22 15:38
文章分类

全部博文(109)

文章存档

2013年(2)

2011年(16)

2010年(90)

2009年(1)

我的朋友

分类:

2010-07-25 15:25:49

/****************************************************************
* 函数名称:
*      Convert256toGray()
*
* 参数:
*     HDIB hDIB     -图像的句柄
*
*  返回值:
*        无
*
*  功能:
*     将256色位图转化为灰度图
*
***************************************************************/
void Convert256toGray(HDIB hDIB)
{
 LPSTR lpDIB;
 
 // 由DIB句柄得到DIB指针并锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);
 
 // 指向DIB象素数据区的指针
 LPSTR   lpDIBBits; 
 // 指向DIB象素的指针
 BYTE * lpSrc; 
 // 图像宽度
 LONG lWidth; 
 // 图像高度
LONG   lHeight; 
 // 图像每行的字节数
 LONG lLineBytes; 
 // 指向BITMAPINFO结构的指针(Win3.0)
 LPBITMAPINFO lpbmi; 
 // 指向BITMAPCOREINFO结构的指针
 LPBITMAPCOREINFO lpbmc;
 
 // 获取指向BITMAPINFO结构的指针(Win3.0)
 lpbmi = (LPBITMAPINFO)lpDIB; 
 // 获取指向BITMAPCOREINFO结构的指针
 lpbmc = (LPBITMAPCOREINFO)lpDIB; 
 // 灰度映射表
 BYTE bMap[256];
 
 // 计算灰度映射表(保存各个颜色的灰度值),并更新DIB调色板
 int i,j;
 for (i = 0; i < 256; i ++)
 {
  // 计算该颜色对应的灰度值
  bMap[i] = (BYTE)(0.299 * lpbmi->bmiColors[i].rgbRed +
          0.587 * lpbmi->bmiColors[i].rgbGreen +
             0.114 * lpbmi->bmiColors[i].rgbBlue + 0.5);   
  // 更新DIB调色板红色分量
  lpbmi->bmiColors[i].rgbRed = i; 
  
  // 更新DIB调色板绿色分量
  lpbmi->bmiColors[i].rgbGreen = i; 
  
  // 更新DIB调色板蓝色分量
  lpbmi->bmiColors[i].rgbBlue = i;
   
  // 更新DIB调色板保留位
  lpbmi->bmiColors[i].rgbReserved = 0;
 }
 // 找到DIB图像象素起始位置
 lpDIBBits = ::FindDIBBits(lpDIB);
  
 // 获取图像宽度
 lWidth = ::DIBWidth(lpDIB); 
 // 获取图像高度
 lHeight = ::DIBHeight(lpDIB); 
 // 计算图像每行的字节数
 lLineBytes = WIDTHBYTES(lWidth * 8); 
// 更换每个象素的颜色索引(即按照灰度映射表换成灰度值)
//逐行扫描
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];
}
}
//解除锁定
::GlobalUnlock ((HGLOBAL)hDIB);
}
阅读(678) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~