openCv学习笔记(十一)—位图的读取与存储(c语言实现)

typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;
typedef long LONG;

//位图文件头定义;
//其中不包含文件类型信息(由于结构体的内存结构决定,
//要是加了的话将不能正确读取文件信息)
typedef struct tagRGBQUAD{
	BYTE rgbBlue; //该颜色的蓝色分量
	BYTE rgbGreen; //该颜色的绿色分量
	BYTE rgbRed; //该颜色的红色分量
	BYTE rgbReserved; //保留值
}RGBQUAD;//调色板定义
typedef struct  tagBITMAPFILEHEADER{
	//WORD bfType;//文件类型,必须是0x424D,即字符“BM”
	DWORD bfSize;//文件大小
	WORD bfReserved1;//保留字
	WORD bfReserved2;//保留字
	DWORD bfOffBits;//从文件头到实际位图数据的偏移字节数
}BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER{
	DWORD biSize;//信息头大小
	LONG biWidth;//图像宽度
	LONG biHeight;//图像高度
	WORD biPlanes;//位平面数,必须为1
	WORD biBitCount;//每像素位数
	DWORD  biCompression; //压缩类型
	DWORD  biSizeImage; //压缩图像大小字节数
	LONG  biXPelsPerMeter; //水平分辨率
	LONG  biYPelsPerMeter; //垂直分辨率
	DWORD  biClrUsed; //位图实际用到的色彩数
	DWORD  biClrImportant; //本位图中重要的色彩数
	
}BITMAPINFOHEADER; //位图信息头定义



//像素信息
typedef struct tagIMAGEDATA
{
	int *data;
	RGBQUAD strPla[256];//256色调色板
	//BYTE green;
	//BYTE red;
}IMAGEDATA;

#include 
//#include "BmpRot.h"
#include "stdlib.h"
#include "math.h"
#include 

//#define PI 3.14159//圆周率宏定义
#define LENGTH_NAME_BMP 30//bmp图片文件名的最大长度

using namespace std;

//变量定义
//BITMAPFILEHEADER strHead;
//RGBQUAD strPla[256];//256色调色板
//BITMAPINFOHEADER strInfo;

//显示位图文件头信息
void showBmpHead(BITMAPFILEHEADER pBmpHead){
	cout<<"位图文件头:"<strPla[nCounti].rgbBlue),1,sizeof(BYTE),fp);
		fread((char *)&(imagedata->strPla[nCounti].rgbGreen),1,sizeof(BYTE),fp);
		fread((char *)&(imagedata->strPla[nCounti].rgbRed),1,sizeof(BYTE),fp);
		fread((char *)&(imagedata->strPla[nCounti].rgbReserved),1,sizeof(BYTE),fp);
	}

    int	width = strInfo.biWidth;
	int height = strInfo.biHeight;
	int nxy = width*height;
	//图像每一行的字节数必须是4的整数倍
	//width = (width * sizeof(BYTE) + 3) / 4 * 4;
	//imagedata = (IMAGEDATA*)malloc(width * height * sizeof(IMAGEDATA));
	data = (unsigned char*)malloc(width * height*sizeof(BYTE));
    imagedata->data=(int*)malloc(width * height*sizeof(int));
	
	fread(data,sizeof(BYTE), width*height,fp);
	int *temp;
	temp = imagedata->data;

	for( int i = 0;  i < nxy;  i++, temp++, data++ )
	{
		
		*temp = (int) (255-(*data));//读取数据,取反,复制给intdat
		//int p=  (int) (*data);
		//cout<>strFile;
	FILE *fpi,*fpw;
	fpi=fopen(strFile,"rb");
	if(fpi != NULL){
		//先读取文件类型
		WORD bfType;
		fread(&bfType,1,sizeof(WORD),fpi);
		if(0x4d42!=bfType)
		{
			cout<<"the file is not a bmp file!"<>RotateAngle;
	angle = 1.0 * RotateAngle * PI / 180;
	for(int i = 0;i < 2 * height;++i)
	{
		for(int j = 0;j < 2 * width;++j)
		{
			after_i = i - midX_aft;//坐标变换
			after_j = j - midY_aft;
			pre_i = (int)(cos((double)angle) * after_i - sin((double)angle) * after_j) + midX_pre;
			pre_j = (int)(sin((double)angle) * after_i + cos((double)angle) * after_j) + midY_pre;
			if(pre_i >= 0 && pre_i < height && pre_j >= 0 && pre_j < width)//在原图范围内
				*(imagedataRot + i * 2 * width + j) = *(imagedata + pre_i * width + pre_j);
		}
	}

	//保存bmp图片
	if((fpw=fopen("b.bmp","wb"))==NULL)
	{
		cout<<"create the bmp file error!"<
此程序实现了bmp图像的读取和存取,主要是理解位图的存储格式,这个程序就比较简单了,剩下的就是对数据流的操作。对于bmp图像结构可以看 http://blog.csdn.net/caiye917015406/article/details/7849316

你可能感兴趣的:(OpenCV,学习)