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;
}
*
* 函数名称:
* 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;
}
相关文章推荐
- word中将彩色图片转为灰度图
- 将24位真彩色位图保存为256色(8位)位图
- 关于批量将彩色图转为灰度图
- DIB(设备无关位图)编程系列(二)―24位真彩图转256阶(8位)灰度图
- 将彩色图片转为灰度图
- 彩色图转为灰度图
- 256色转灰度+24位真彩色转灰度
- DIB(设备无关位图)编程系列(二)——24位真彩图转256阶(8位)灰度图
- 比较两幅相似图像的差异(灰度图转成伪彩色图识别)
- cocos2dx实现 彩色图转灰度图算法
- 影像分类结果灰度图变彩色
- Qt下256彩色BMP&JPG图像生成
- android把彩色图像变成灰度图(黑白)
- opencv学习——彩色图转 灰度图和二值化
- android 将彩色图转换为灰度图
- 24位真彩色转换为8位灰度图片(完整代码)
- 24位真彩位图转4位(16色)灰度图(BMP)
- 彩色图片转换为灰度图(方法)
- 32位全彩色和24位全彩色有啥区别
- 彩色图转灰度图的原理和参考源码