zoukankan      html  css  js  c++  java
  • C/C++ BMP(24位真彩色)图像处理(1)------图像打开与数据区处理

    在图像处理过程中,通常以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的倍数  
      
    #define MYCUT_HEIGHT 100    //截取高度  
    #define MYCUT_WIDTH 100     //截取宽度  
    #define BEGIN_X 0           //截取位图开始位置X坐标  
    #define BEGIN_Y 0           //截取位图开始位置Y坐标  
      
    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("图像处理完成
    ");
    	printf("运行时间为:%dms
    ",int(((double)(clock()-now))/CLOCKS_PER_SEC*1000));//输出图像处理花费时间信息
    }
    




  • 相关阅读:
    在spring官网上下载历史版本的spring插件,springsource-tool-suite
    转载---VB DorpDownList控件 添加选项
    VB,将"秒"转成"时分秒"格式
    VB.NET 改变datatable数据类型
    转载--- C# 图片与base64编码 互相转换
    转载--- php5.6:Call to undefined function curl_init()的解决办法
    转载--- navicat12破解版(英文、中文)
    转载---mysql导出事件、存储过程、函数、库表
    C# 读取mysql blob字段(两种方式)
    转载---安装mysql5.7,遇到的问题
  • 原文地址:https://www.cnblogs.com/weixinhum/p/3916706.html
Copyright © 2011-2022 走看看