C/C++ BMP(24位真彩色)图像处理(1)------图像の打开与数据区处理
来源:互联网 发布:免流端口 编辑:程序博客网 时间:2024/05/20 14:42
在图像处理过程中,通常以MATLAB代码进行实验,然而在具体的应用中,由于效率和可移植性等各种问题,几乎不可避免的要将图像处理用c甚至于汇编来实现。下面介绍在c或者c++环境下图像处理模板的搭建程序代码。本程序代码只针对于bmp图像数据区进行操作,可方便的移植到嵌入式等开发环境。本程序关于读入bmp部分代码属于网友分享代码资源。
在vs开发环境下新建win32空项目,添加.cpp文件,将下面代码复制到该文件中,修改读入图像和输出图像路径后编译即可。
#include <string.h> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include<time.h>//时间相关头文件,可用其中函数计算图像处理速度 #define WIDTHBYTES(bits) (((bits)+31)/32*4)//用于使图像宽度所占字节数为4byte的倍数 typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned long DWORD; typedef long LONG; //位图文件头信息结构定义 //其中不包含文件类型信息(由于结构体的内存结构决定,要是加了的话将不能正确读取文件信息) typedef struct tagBITMAPFILEHEADER { DWORD bfSize; //文件大小 WORD bfReserved1; //保留字,不考虑 WORD bfReserved2; //保留字,同上 DWORD bfOffBits; //实际位图数据的偏移字节数,即前三个部分长度之和 } BITMAPFILEHEADER; //信息头BITMAPINFOHEADER,也是一个结构,其定义如下: typedef struct tagBITMAPINFOHEADER{ //public: DWORD biSize; //指定此结构体的长度,为40 LONG biWidth; //位图宽 LONG biHeight; //位图高 WORD biPlanes; //平面数,为1 WORD biBitCount; //采用颜色位数,可以是1,2,4,8,16,24,新的可以是32 DWORD biCompression; //压缩方式,可以是0,1,2,其中0表示不压缩 DWORD biSizeImage; //实际位图数据占用的字节数 LONG biXPelsPerMeter; //X方向分辨率 LONG biYPelsPerMeter; //Y方向分辨率 DWORD biClrUsed; //使用的颜色数,如果为0,则表示默认值(2^颜色位数) DWORD biClrImportant; //重要颜色数,如果为0,则表示所有颜色都是重要的 } BITMAPINFOHEADER; void main(){long now=0;now=clock();//存储图像处理开始时间BITMAPFILEHEADER bitHead;BITMAPINFOHEADER bitInfoHead; FILE* pfile;FILE* wfile;char strFile[50]="E:\\testpicture\\1.bmp";//打开图像路径,需修改为自己图像存储的路径char strFilesave[50]="E:\\testpicture\\2.bmp";//处理后图像存储路径,需修改为自己图像存储的路径pfile = fopen(strFile,"rb");//文件打开图像wfile = fopen(strFilesave,"wb");//打开文件为存储修改后图像做准备//读取位图文件头信息WORD fileType;fread(&fileType,1,sizeof(WORD),pfile);fwrite(&fileType,1,sizeof(WORD),wfile);if(fileType != 0x4d42){printf("file is not .bmp file!");return;}fread(&bitHead,1,sizeof(tagBITMAPFILEHEADER),pfile);fwrite(&bitHead,1,sizeof(tagBITMAPFILEHEADER),wfile);//写回位图文件头信息到输出文件 //读取位图信息头信息fread(&bitInfoHead,1,sizeof(BITMAPINFOHEADER),pfile);fwrite(&bitInfoHead,1,sizeof(BITMAPINFOHEADER),wfile);//写回位图信息头信息到输出文件 int width = bitInfoHead.biWidth;int height = bitInfoHead.biHeight;//分配内存空间把源图存入内存 int l_width = WIDTHBYTES(width* bitInfoHead.biBitCount);//计算位图的实际宽度并确保它为4byte的倍数 BYTE *pColorData=(BYTE *)malloc(height*l_width);//开辟内存空间存储图像数据memset(pColorData,0,height*l_width); BYTE *pColorDataMid=(BYTE *)malloc(height*l_width);//开辟内存空间存储图像处理之后数据memset(pColorDataMid,0,height*l_width); long nData = height*l_width;//把位图数据信息读到数组里 fread(pColorData,1,nData,pfile);//图像处理可通过操作这部分数据加以实现,可将下面的示例修改为中值滤波等各种图像处理模块//在嵌入式开发环境下,大多数情况下已经得到图像数据区,是故将下面部分代码稍作修改就可以移植到嵌入式端/*******************图像处理部分******************//*******************示例,将图像亮度减半******************/for(int hnum=0;hnum<height;hnum++)for(int wnum=0;wnum<width;wnum++){int pixel_point=hnum*l_width+wnum*3;//数组位置偏移量,对应于图像的各像素点RGB的起点 pColorDataMid[pixel_point]=pColorData[pixel_point]*0.5;pColorDataMid[pixel_point+1]=pColorData[pixel_point+1]*0.5;pColorDataMid[pixel_point+2]=pColorData[pixel_point+2]*0.5;}/*******************示例,将图像亮度减半******************//*******************亮度控制******************/fwrite(pColorDataMid,1,nData,wfile);//将处理完图像数据写回文件fclose(pfile);fclose(wfile);printf("图像处理完成\n");printf("运行时间为:%dms\n",clock()-now);//输出图像处理花费时间信息}
1 0
- C/C++ BMP(24位真彩色)图像处理(1)------图像の打开与数据区处理
- C/C++ BMP(24位真彩色)图像处理(1)------图像の打开与数据区处理
- C/C++ BMP(24位真彩色)图像处理(2)------图像の截取
- C/C++ BMP(24位真彩色)图像处理(4)------图像の旋转
- C/C++ BMP(24位真彩色)图像处理(5)------图像の线性变换
- C/C++ BMP(24位真彩色)图像处理(2)------图像の截取
- C/C++ BMP(24位真彩色)图像处理(4)------图像の旋转
- C/C++ BMP(24位真彩色)图像处理(5)------图像の线性变换
- C/C++ BMP(24位真彩色)图像处理(3)------图像の放大缩小(双线性插值)
- C/C++ BMP(24位真彩色)图像处理(3)------图像の放大缩小(双线性插值)
- C语言处理BMP图像
- BMP图像的处理(24位转16位)
- 8叉数算法处理将24位真彩色变为8位伪彩色图像
- BMP--24位真彩色转换为灰度图像
- 编程学C#(2):BMP图像处理
- C# 图像 24位转32位(真彩色)
- 标题:C语言处理BMP图像
- 彩色图像处理(RGB图像)
- springrain -权限表结构 分析设计 Jfinal 代码生成器
- 快速幂
- 实用类读书法V1.0
- nyoj 61 传纸条(一)
- Mac下搭建quick cocos2d-x编译环境
- C/C++ BMP(24位真彩色)图像处理(1)------图像の打开与数据区处理
- STL小讲
- [2011山东ACM省赛] Mathman Bank(模拟题)
- 如何调试Suspend-Resume相关的Bug
- android中的Fragment
- proc文件系统解析
- 各种排序算法分析比较
- 设置属性
- Mac下的私有API私有函数扫描