设为首页 加入收藏

TOP

1.2.3 BMP图像位图数据的访问
2013-10-07 00:19:28 来源: 作者: 【 】 浏览:63
Tags:1.2.3 BMP 图像 位图 数据 访问

1.2.3  BMP图像位图数据的访问

上面main()函数将图像文件读入内存,又写到文件里去,那么在读入图像数据后、写入文件前的一段时间里,图像的数据是在内存中存在的,这也是我们可以修改(访问)图像数据的时机所在。

假设内存中位图数据的指针为pBmpBuf,一行像素所占的字节数为lineByte(4的倍数)那么,对于灰度图像,第i行第j列的像素指针(所在的存储空间位置)为pBmpBuf+i*lineByte+j,*(pBmpBuf+i*lineByte+j)是该像素的灰度值,如果想让该像素变成指定颜色,只需要给*(pBmpBuf+i*lineByte+j)赋指定的值即可;对于彩色图像,每像素占3个字节,那么pBmpBuf+i*lineByte+j*3+0、pBmpBuf+i*lineByte+j*3+1、pBmpBuf+i*lineByte+j*3+2分别代表了第i行第j列像素B、G、R三个分量的指针,若想给该点指定一种颜色,则需要给三个分量分别赋值。
下面的main()函数中,将读入的图像数据左下角1/4部分置成黑色并存盘,图1-10所示是程序运行前后图像的变化情况。

 void main()
{
//读入指定BMP文件进内存
char readPath[]="dog.BMP";
readBmp(readPath);
 //输出图像的信息
printf("width=%d,height=%d,biBitCount=%d\n",
bmpWidth,bmpHeight,biBitCount);

//循环变量,图像的坐标
int i,j;
//每行字节数
int lineByte=(bmpWidth*biBitCount/8+3)/4*4;
 //循环变量,针对彩色图像,遍历每像素的三个分量
int k;
 //将图像左下角1/4部分置成黑色
if(biBitCount==8){//对于灰度图像
for(i=0;i<bmpHeight/2;i++){
for(j=0;j<bmpWidth/2;j++){
*(pBmpBuf+i*lineByte+j)=0;
}
}
}
else if(biBitCount==24){//彩色图像
for(i=0;i<bmpHeight/2;i++){
for(j=0;j<bmpWidth/2;j++){
for(k=0;k<3;k++)//每像素RGB三个分量分别置0才变成黑色
*(pBmpBuf+i*lineByte+j*3+k)=0;
}
}
}
    //将图像数据存盘
char writePath[]="dogcpy.BMP";
saveBmp(writePath, pBmpBuf, bmpWidth,
bmpHeight, biBitCount, pColorTable);
 //清除缓冲区,pBmpBuf和pColorTable是全局变量,
在文件读入时申请的空间
delete []pBmpBuf;
if(biBitCount==8)
delete []pColorTable;
}

  
(点击查看大图)图1-10  数据修改后图像对比

【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.3.1 从资源中装入GDI位图 下一篇1.3 GDI对象及GDI位图

评论

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