24位真彩色图像转8位灰度图像

/*************************************************************************

* 函数名称:Gray24Bits( )

* 函数类型:LPSTR

* 参数:    LPSTR lpDIB      - 指向源DIB图像指针

* 返回值:  BOOL            - 转换成功返回TRUE,否则返回FALSE。

* 函数功能:24位真彩色图像转8位灰度图像

*************************************************************************/
BOOL Gray24Bits(LPSTR lpDIB)
{
// 找到DIB图像象素起始位置
LPSTR  lpDIBBits; // 指向DIB象素指针
lpDIBBits =FindDIBBits(lpDIB);

LPBITMAPINFOHEADER lpDIBHdr; // 指向BITMAPINFOHEADER的指针
lpDIBHdr = (LPBITMAPINFOHEADER)lpDIB;

LPSTR lpGrayBits;

// 计算位图图的信息头、调色板和图形数据的大小, 并给灰度图分配内存
int dwInfo = lpDIBHdr->biSize;
int dwData = lpDIBHdr->biSizeImage;
    dwData=(lpDIBHdr->biHeight) * (lpDIBHdr->biWidth);
int dwGrayData = dwData/3;
int dwGrayPal = 256 * sizeof(RGBQUAD);
int sizeTotal=dwInfo+dwGrayPal+dwGrayData;       


// 创建灰度图的颜色表 
RGBQUAD* lpGrayRgbQuag=(RGBQUAD*)(lpDIB+lpDIBHdr->biSize);//指向内存中的灰度颜色表

int  rowLenSr=WIDTHBYTES(24*lpDIBHdr->biWidth);//行字节数
int  rowLenDes=WIDTHBYTES(8*lpDIBHdr->biWidth);
int  sizeGrayBits=rowLenDes*lpDIBHdr->biHeight;

int i;

if(24==lpDIBHdr->biBitCount)


lpDIBHdr->biSizeImage=sizeTotal;
lpDIBHdr->biBitCount=8;
lpDIBHdr->biClrUsed=256;

  for(i=0;i <256;i++)
  {
            lpGrayRgbQuag->rgbBlue=i;
            lpGrayRgbQuag->rgbGreen=i;
            lpGrayRgbQuag->rgbRed=i;
            lpGrayRgbQuag->rgbReserved=0;
  lpGrayRgbQuag++;//写入内存中的灰度颜色表
  }

}

//图像区转换
HGLOBAL hGray=(HGLOBAL)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, sizeGrayBits);//分配内存
lpGrayBits = (LPSTR) ::GlobalLock(hGray);//内存数据指针

if (hGray==0)
{
  return false;  //内存分配失败则返回false
}

LPBYTE lpos=(LPBYTE)lpDIBBits;

BYTE nGray;
 
int x,y,z,m,pos;

for( y=0; y <lpDIBHdr->biHeight; y++ )
{
pos = 0;
pos = y*rowLenSr;
m  = 0;
m  = y*rowLenDes;
for( x=0,z=m; x <rowLenSr; x=x+3,z++)
{
        nGray = (BYTE)( lpos[pos+x]*0.114 + lpos[pos+x+1]*0.587 + lpos[pos+x+2]*0.299);
lpGrayBits[z] = (unsigned char) nGray;
}
}

memcpy(lpGrayRgbQuag,lpGrayBits,sizeGrayBits);
::GlobalUnlock( hGray );
return TRUE;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值