C/C++ BMP(24位真彩色)图像处理(1)------图像の打开与数据区处理

来源:互联网 发布:jquery数组push对象 编辑:程序博客网 时间:2024/06/01 11:57

    在图像处理过程中,通常以MATLAB代码进行实验,然而在具体的应用中,由于效率和可移植性等各种问题,几乎不可避免的要将图像处理用c甚至于汇编来实现。下面介绍在c或者c++环境下图像处理模板的搭建程序代码。本程序代码只针对于bmp图像数据区进行操作,可方便的移植到嵌入式等开发环境。本程序关于读入bmp部分代码属于网友分享代码资源。

    在vs开发环境下新建win32空项目,添加.cpp文件,将下面代码复制到该文件中,修改读入图像和输出图像路径后编译即可。

[cpp] view plain copy
print?
  1. #include <string.h>     
  2. #include <math.h>       
  3. #include <stdio.h>       
  4. #include <stdlib.h>       
  5. #include <malloc.h>    
  6.     
  7. #include<time.h>//时间相关头文件,可用其中函数计算图像处理速度    
  8.     
  9. #define   WIDTHBYTES(bits) (((bits)+31)/32*4)//用于使图像宽度所占字节数为4byte的倍数    
  10.     
  11. typedef unsigned char  BYTE;    
  12. typedef unsigned short WORD;    
  13. typedef unsigned long  DWORD;    
  14. typedef long LONG;    
  15.     
  16. //位图文件头信息结构定义    
  17. //其中不包含文件类型信息(由于结构体的内存结构决定,要是加了的话将不能正确读取文件信息)    
  18.     
  19. typedef struct tagBITMAPFILEHEADER {    
  20. DWORD  bfSize;          //文件大小    
  21. WORD   bfReserved1;     //保留字,不考虑    
  22. WORD   bfReserved2;     //保留字,同上    
  23. DWORD  bfOffBits;       //实际位图数据的偏移字节数,即前三个部分长度之和    
  24. } BITMAPFILEHEADER;     
  25.     
  26. //信息头BITMAPINFOHEADER,也是一个结构,其定义如下:    
  27.     
  28. typedef struct tagBITMAPINFOHEADER{    
  29. //public:    
  30. DWORD   biSize;             //指定此结构体的长度,为40    
  31. LONG    biWidth;            //位图宽    
  32. LONG    biHeight;           //位图高    
  33. WORD    biPlanes;           //平面数,为1    
  34. WORD    biBitCount;         //采用颜色位数,可以是1,2,4,8,16,24,新的可以是32    
  35. DWORD   biCompression;      //压缩方式,可以是0,1,2,其中0表示不压缩    
  36. DWORD   biSizeImage;        //实际位图数据占用的字节数    
  37. LONG    biXPelsPerMeter;    //X方向分辨率    
  38. LONG    biYPelsPerMeter;    //Y方向分辨率    
  39. DWORD   biClrUsed;          //使用的颜色数,如果为0,则表示默认值(2^颜色位数)    
  40. DWORD   biClrImportant;     //重要颜色数,如果为0,则表示所有颜色都是重要的    
  41. } BITMAPINFOHEADER;     
  42.   
  43. void main()  
  44. {  
  45.     long now=0;  
  46.     now=clock();//存储图像处理开始时间  
  47.   
  48.     BITMAPFILEHEADER bitHead;  
  49.     BITMAPINFOHEADER bitInfoHead;   
  50.     FILE* pfile;  
  51.     FILE* wfile;  
  52.   
  53.     char strFile[50]="E:\\testpicture\\1.bmp";//打开图像路径,需修改为自己图像存储的路径  
  54.     char strFilesave[50]="E:\\testpicture\\2.bmp";//处理后图像存储路径,需修改为自己图像存储的路径  
  55.     pfile = fopen(strFile,"rb");//文件打开图像  
  56.     wfile = fopen(strFilesave,"wb");//打开文件为存储修改后图像做准备  
  57.   
  58.     //读取位图文件头信息  
  59.     WORD fileType;  
  60.     fread(&fileType,1,sizeof(WORD),pfile);  
  61.     fwrite(&fileType,1,sizeof(WORD),wfile);  
  62.     if(fileType != 0x4d42)  
  63.     {  
  64.         printf("file is not .bmp file!");  
  65.         return;  
  66.     }  
  67.     fread(&bitHead,1,sizeof(tagBITMAPFILEHEADER),pfile);  
  68.     fwrite(&bitHead,1,sizeof(tagBITMAPFILEHEADER),wfile);//写回位图文件头信息到输出文件    
  69.   
  70.     //读取位图信息头信息  
  71.     fread(&bitInfoHead,1,sizeof(BITMAPINFOHEADER),pfile);  
  72.     fwrite(&bitInfoHead,1,sizeof(BITMAPINFOHEADER),wfile);//写回位图信息头信息到输出文件    
  73.   
  74.     int width = bitInfoHead.biWidth;  
  75.     int height = bitInfoHead.biHeight;  
  76.     //分配内存空间把源图存入内存     
  77.     int l_width = WIDTHBYTES(width* bitInfoHead.biBitCount);//计算位图的实际宽度并确保它为4byte的倍数   
  78.   
  79.     BYTE    *pColorData=(BYTE *)malloc(height*l_width);//开辟内存空间存储图像数据  
  80.     memset(pColorData,0,height*l_width);     
  81.   
  82.     BYTE    *pColorDataMid=(BYTE *)malloc(height*l_width);//开辟内存空间存储图像处理之后数据  
  83.     memset(pColorDataMid,0,height*l_width);   
  84.   
  85.     long nData = height*l_width;  
  86.   
  87.     //把位图数据信息读到数组里     
  88.     fread(pColorData,1,nData,pfile);//图像处理可通过操作这部分数据加以实现,可将下面的示例修改为中值滤波等各种图像处理模块  
  89.                                     //在嵌入式开发环境下,大多数情况下已经得到图像数据区,是故将下面部分代码稍作修改就可以移植到嵌入式端  
  90.   
  91.     /*******************图像处理部分******************/  
  92.         /*******************示例,将图像亮度减半******************/  
  93.         for(int hnum=0;hnum<height;hnum++)  
  94.             for(int wnum=0;wnum<width;wnum++)  
  95.             {  
  96.                 int pixel_point=hnum*l_width+wnum*3;//数组位置偏移量,对应于图像的各像素点RGB的起点    
  97.                 pColorDataMid[pixel_point]=pColorData[pixel_point]*0.5;  
  98.                 pColorDataMid[pixel_point+1]=pColorData[pixel_point+1]*0.5;  
  99.                 pColorDataMid[pixel_point+2]=pColorData[pixel_point+2]*0.5;  
  100.             }  
  101.         /*******************示例,将图像亮度减半******************/  
  102.     /*******************亮度控制******************/  
  103.   
  104.     fwrite(pColorDataMid,1,nData,wfile);//将处理完图像数据写回文件  
  105.     fclose(pfile);  
  106.     fclose(wfile);  
  107.   
  108.     printf("图像处理完成\n");  
  109.     printf("运行时间为:%dms\n",clock()-now);//输出图像处理花费时间信息  
  110. }  




阅读全文
0 0
原创粉丝点击