基于C++实现的BMP位图图像处理程序

Tempted

发布日期: 2020-11-20 08:40:55 浏览量: 87
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

1.介绍

本程序主要功能是用c++实现图像的灰度、二值转换、对比度调节的功能。需要了解位图文件文件头结构;灰度、二值转换、对比度调节的具体算法;并对C++知识有一定的了解。

具体的开发环境为:

  • 操作系统:windows 10

  • 开发工具:VS2013

2.技术细节

2.1 位图文件头和信息头结构

位图文件共由四部分组成:bmp文件头、位图信息头、调色板和位图数据。其中文件头和信息头中存放了位图文件的基本信息,如:文件格式、文件大小、位图尺寸等。

其中bmp文件头的windows结构体定义为BITMAPFILEHEADER。位图信息头的windows结构体定义为BITMAPINFOHEADER。结构如下图所示:

BITMAPFILEHEADER结构体

BITMAPINFOHEADER结构体

2.2 灰度图的计算

读取每个像素点的RGB值,通过公式计算出相应的灰度值,并赋给相应的RGB值。

计算公式

  1. Gary = (299*R + 587*G + 114*B + 500) / 1000

核心算法

2.3 二值图的计算

二值图计算较为简单,先调用灰度图的算法将图片转为灰度图,再设置一个常数,大于这个常数的值全部赋值为255,小于这个常数的值全部赋值为0。

核心算法

2.4 对比度调节的计算

对比度调节先设定一个常数,大于该常数的加上用户给定的数;小于该常量的减去用户给定的数。最大为255,最小为0。

核心算法

  1. 读取RGB
  2. If ( R\G\B >= 常数)
  3. R\G\B += 用户所给数
  4. else
  5. R\G\B -= 用户所给数
  6. If ( R\G\B > 255 )
  7. *(R\G\B) = 255
  8. If ( R\G\B < 0 )
  9. *(R\G\B) = 0
  10. else
  11. *(R\G\B) = R\G\B

2.5 重要细节处理

Windows规定位图数据每行的字节数必须为4的整数倍,所以每行不够4的整数倍要补0

读的方面:

通过增加一次读写读出文件真正的RGB数据,先将位图的数据读到buf中,再通过write_txt()函数,跳过每行所补的0,写到fuben.txt当中。再通过fread()将真正的位图数据读到buf中。

写的方面:

通过bytesPerLine = (3 * (width + 1) / 4) * 4计算每行应该存入的字节数,将RGB数据写入line中,最后不足的补 0 。最后以每一行的方式写入文件中。

读出的RGB数据转换成整型的变成负数

因为读入时是以char的形式,所以转换成整型的会将高位当做符号位,所以会出现负数。通过编写一段函数可重新修正RGB的值。

3.实验结果

程序运行界面

程序开始先打开文件,然后出现三个菜单,选择相要实现的功能并输入文件的保存位置即可。

结果对比图:

图一到图四分别为原图、灰度图、二值图和调整对比度的后的图片,实现了上述功能。

上传的附件 cloud_download 基于C++实现的BMP位图图像处理程序.7z ( 1.88mb, 1次下载 )
error_outline 下载需要9点积分

发送私信

永远别说永远,凡事都有可能

8
文章数
14
评论数
最近文章
eject