您的位置:首页 > 其它

24位真彩色转为256灰度图

2010-07-14 10:20 344 查看
/*************************************************************************
*
* 函数名称:
* ConvertToGrayScale()
*
* 参数:
* LPSTR lpDIB - ???ò??DIB????????
*
* 返回值:
* BOOL - 成功返回TRUE,否则FALSE
*
* 说明:
* 将24位真彩色转为256灰度图像
************************************************************************/
BOOL WINAPI ConvertToGrayScale(LPSTR lpDIB)
{

LPSTR lpDIBBits; //指针DIB像素的指针
LPSTR lpNewDIBBits; //指向DIB灰度图像(新图像)的开始处像素的指针
LONG lLineBytes;
unsigned char * lpSrc; //指向原图像像素点的指针
unsigned char * lpdest; //指向目标图像的像素点的指针

unsigned char *ired,*igreen,*iblue;

long lWidth; //图像的宽度和高度
long lHeight;

long i,j; //循环变量

lWidth = ::DIBWidth(lpDIB); //DIB宽度
lHeight = ::DIBHeight(lpDIB); //DIB 高度
RGBQUAD *lpRGBquad;
lpRGBquad = (RGBQUAD *)&lpDIB[sizeof(BITMAPINFOHEADER)]; //INFOHEADER后为调色板
if(::DIBNumColors(lpDIB) == 256) //256色位图不作任何处理
{
return TRUE;
}

if(::DIBNumColors(lpDIB) != 256) //非256色位图将它灰度化
{
lLineBytes = WIDTHBYTES(lWidth*8*3);
lpdest= new BYTE[lHeight*lWidth];
lpDIBBits = (LPSTR)lpDIB + sizeof(BITMAPINFOHEADER);//指向DIB像素
for(i = 0;i < lHeight; i++)
for(j = 0;j < lWidth*3; j+=3)
{
ired = (unsigned char*)lpDIBBits + lLineBytes * i + j + 2;
igreen = (unsigned char*)lpDIBBits + lLineBytes * i + j + 1;
iblue = (unsigned char*)lpDIBBits + lLineBytes * i + j ;
lpdest[i*lWidth + j/3] = (unsigned char)((*ired)*0.299 + (*igreen)*0.588 + (*iblue)*0.114);
}

//需要做三件事:1修改INFOHEADER 2.增加调色板 3.修改原图像灰度值
LPBITMAPINFOHEADER lpBI;
lpBI = (LPBITMAPINFOHEADER)lpDIB;
lpBI->biBitCount = 8;

//设置灰度调色板
for(i = 0;i < 256;i++)
{
lpRGBquad[i].rgbRed = (unsigned char)i;
lpRGBquad[i].rgbGreen = (unsigned char)i;
lpRGBquad[i].rgbBlue = (unsigned char)i;
lpRGBquad[i].rgbReserved = 0;
}

lpNewDIBBits= ::FindDIBBits(lpDIB); //找到DIB(新的)像素的起始位置
lLineBytes=WIDTHBYTES(lWidth * 8);
//修改灰度值
for(i = 0;i < lHeight; i++)
for(j = 0;j < lWidth; j++)
{
lpSrc = (unsigned char*)lpNewDIBBits + lLineBytes * i+ j ;
*lpSrc=lpdest[i*lWidth+j];
}
delete lpdest;
}
return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: