C语言图像处理:bmp格式读图 1/4改变颜色
实现原理
1、图片读取
BMP文件的数据按照从文件头开始的先后顺序分为四个部分:
1.bmp文件头:提供文件的格式、大小等信息
#define BITMAPFILEHEADERLENGTH 14 // 24bit文件头长度为14
2.位图信息头:提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息
#define BM 19778 // BM的ASCII码为19778,BM为位图的标识符
long width ; // 宽的像素值
long height ; // 高的像素值
3.调色板:(可选)如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表
4.位图数据:即图像数据,将三通道的颜色分别存入三个数组。
unsigned char r[2000][2000];
unsigned char g[2000][2000];
unsigned char b[2000][2000];
读取图片:
(111.bmp)
2、1/4处改变颜色(红色)
1/4处改变颜色(红色)
实验选用图片尺寸:434*499
色彩空间:RGB
Alpha通道:否
将图像尺寸存储到两个变量中long width ; 和long height ;中,根据要求,将尺寸分别除以2。即可以达到1/4的效果。并用遍历所有像素点,将三个通道中除了红色外其他颜色全部置0。
for(j=height/2;j<height;j++)//像素排列为从下到上,从左到右
{
fread(pix, 1, stride, fpbmp);
for(i=0;i<width/2;i++)//将图片的上1/4的像素点改为红色
{
r[height-1-j][i]=255;
g[height-1-j][i]=0;
b[height-1-j][i]=0;
}
}
效果图片:
(111part.bmp)
3、RGB转灰度图
根据人眼对红绿蓝三色的敏感程度,有一个著名的心理学公式,可以使用以下方式进行转换:
Gray = R*0.299+G*0.587+B*0.114
这也是最常用的一种转换,另外还有一种常用的转换叫平均值法,即取去红绿蓝三色的平均值为灰度:
Gray=(R+G+B)/3;
根据这个公式,依次读取每个像素点的R,G,B值,进行计算灰度值(转换为整型数),将灰度值赋值给一个新的数组,将其写入新图像的对应位置,同理所有像素点遍历一遍后完成转换。
最重要的一点就是区别灰度与灰像的概念,灰度是单通道的,灰像虽然和灰度看上去并无区别,但是仍然是三通道。文件大小会有明显区别。转换的时候需要修改对应头文件
bi2.biBitCount = 8;
效果图片:
(111gray.bmp)
代码实现
具体代码实现参考我的资源
https://download.csdn.net/download/CharlieYYang/13460170实现例程及完整代码