问题:现有一张bmp图片,要求将它读取到程序中并进行灰度化、水平翻转、模糊、茶色滤镜四种效果的一种,并输出新图片,如下所示:
命令行输入:
其中:
参数1:-b/g/s/r,先后表示blur(模糊),grey(灰度化),sepia(褐色),row reverse(水平翻转)
参数2:源文件名
参数3:新文件名
当我第一次接触到这个问题时,是无从下手的。但在查阅了不少资料之后,整整一天,我成功地只用C++实现了打开、修饰、保存bmp文件的功能!
目录
1.bmp文件的基本信息
(1).bmp文件的种类
(2).bmp文件结构(重点)
文件头">1>文件头
信息头">2>信息头
调色板(不作讨论)">3>调色板(不作讨论)
图像颜色信息">4>图像颜色信息
2.实现思路
3.定义相关类、结构体
文件头BmpFileHeader
内存对齐和#pragma pack(n)
信息头BmpFileInfoHeader
颜色结构体RGBTriple
图片类bmp
4.读文件
(1).基础知识
(2).读文件的准备工作
(3).读文件头和数据头
(4).读取图像颜色信息
5.写文件
6.修饰图片
(1).灰度化
(2).棕色滤镜效果
(3).水平翻转
(4).模糊
7.main函数
命令行传参
具体实现
1.bmp文件的基本信息
(1).bmp文件的种类
打开Windows自带的画图软件,发现bmp的存储格式有好几种。
- 单色位图:只有黑白两种颜色,每个像素占1位(1/8字节)
- 16色位图:每个像素占4位(1/2字节)
- 256色位图:每个像素占8位(1字节)
- 24位位图(真彩色):每个像素占24位(3字节),每个字节存储R/G/B三种中的一种颜色数值(0~255)
每个像素占的位数被称为位深度(biBitCount,在后面会用到),可以在图片的属性->详细信息中查看。
(2).bmp文件结构(重点)
bmp文件数据由4部分组成:
- 文件头
- 文件信息头
- 调色板(24位位图无)
- 图像颜色信息
在此只讨论24位位图即真彩色的问题,至于其他的bmp文件种类不做讨论。
先放出图片: