设为首页 加入收藏

TOP

图像编程学习笔记4――24位真彩色转换为灰度图像 (三)
2015-01-25 00:08:34 来源: 作者: 【 】 浏览:434
Tags:图像 编程 学习 笔记 24位 彩色 转换
pColorTable + i)).rgbRed = i;
(*(pColorTable + i)).rgbReserved = 0;
}
//将RGB转换为灰度值
int red,green,blue;
BYTE gray;
pGrayData = new unsigned char[bmpInfoHeader.biSizeImage];
memset(pGrayData,0,bmpInfoHeader.biSizeImage);
//这里要注意,Windows规定一个扫描行所占的字节数必须是
//4的倍数(即以long为单位),不足的以0填充,所以如果当前biWidth如果不是
//4的倍数时,要在后面补0直到为4的倍数
for(i = 0; i < bmpInfoHeader.biHeight; i++ )
{
//位图数据(pBmpData)中存储的实际像素数为biWidth个,而一个扫描行要lineByte个字节,
//多余出来的是上面补的0,所以要转换的要是实际的像素数,
//因为转换前后biWidth是相同的,而lineByte是不同的,也就是后面补的0不同
//如果还有疑惑,请留言提问,我会即时回复
for(int j = 0; j < bmpInfoHeader.biWidth; j++ )
{
red = *(pBmpData + i*oldLineBytes + 3*j );
green = *(pBmpData + i*oldLineBytes + 3*j + 1);
blue = *(pBmpData + i*oldLineBytes + 3*j + 2);
gray = (BYTE)((77 * red + 151 * green + 28 * blue) >> 8);
*(pGrayData + i*lineBytes + j) = gray;
}
}
?
}
/**
* 函数名: writeBmp
* 参 ?数: fileName -- 转换之后的文件名
* 功 ?能: 将转换后的图像信息写入到fileName文件中
*/
bool writeBmp(char *fileName)
{
FILE *fp = fopen(fileName,"wb"); ? //以二进制写方式打开
if(NULL == fp)
{
cout<<"File is opened failure!"<
return FALSE;
}
//写入数据
fwrite(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);
fwrite(&bmpInfoHeader,sizeof(BITMAPINFOHEADER),1,fp);
fwrite(pColorTable,sizeof(RGBQUAD),256,fp);
fwrite(pGrayData,sizeof(unsigned char),bmpInfoHeader.biSizeImage,fp);
fclose(fp);
//释放内存空间
delete []pColorTable;
delete []pBmpData;
delete []pGrayData;
return TRUE;
}
/**
* 函数名: work
* 功 ?能: 主要处理步骤
*/
void work()
{
char readFileName[] = "test1.bmp";
if(!readBmp(readFileName))
cout<<"The function of readBmp error!"<
convert();
char writeFileName[] = "gray.bmp";
if(!writeBmp(writeFileName))
cout<<"The function of writebmp error!"<
cout<<"convert success!"<
?
}
int main()
{
work();
return 0;
}
?
首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇WinVerifyTrust signature verifi.. 下一篇VC++ 编程实现开机自启动

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: