VC中保存BMP位图文件的方法及BMP文件格式带源码实现

发布时间:2011-12-21 01:43:00   来源:文档文库   
字号:

#include "stdio.h"

#include "Windows.h"

//几个全局变量,存放读入图像位图数据、宽、高、颜色表及每像素所占位数(比特)

//此处定义全局变量主要为了后面的图像数据访问及图像存储作准备

unsigned char *pBmpBuf;//读入图像数据的指针

int bmpWidth;//图像的宽

int bmpHeight;//图像的高

RGBQUAD *pColorTable;//颜色表指针

int biBitCount;//图像类型





bool readBmp(char *bmpName)

{

 //二进制读方式打开指定的图像文件

    FILE *fp=fopen(bmpName,"rb");

 if(fp==0) return 0;

 

 

 //跳过位图文件头结构BITMAPFILEHEADER

 fseek(fp, sizeof(BITMAPFILEHEADER),0);

 

 

 //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head

 BITMAPINFOHEADER head;

 fread(&head, sizeof(BITMAPINFOHEADER), 1,fp);

 

 //获取图像宽、高、每像素所占位数等信息

 bmpWidth = head.biWidth;

 bmpHeight = head.biHeight;

 biBitCount = head.biBitCount;

 

 //定义变量,计算图像每行像素所占的字节数(必须是4的倍数)

 int lineByte=(bmpWidth * biBitCount/8+3)/4*4;

 

 //灰度图像有颜色表,且颜色表表项为256

 if(biBitCount==8){

  //申请颜色表所需要的空间,读颜色表进内存

  pColorTable=new RGBQUAD[256];

  fread(pColorTable,sizeof(RGBQUAD),256,fp);

 }

 

 //申请位图数据所需要的空间,读位图数据进内存

 pBmpBuf=new unsigned char[lineByte * bmpHeight];

 fread(pBmpBuf,1,lineByte * bmpHeight,fp);

 

 //关闭文件

 fclose(fp);

 

 return 1;

}





bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height,

    int biBitCount, RGBQUAD *pColorTable)

{

 //如果位图数据指针为0,则没有数据传入,函数返回

 if(!imgBuf)

  return 0;

 

 //颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0

 int colorTablesize=0;

 if(biBitCount==8)

  colorTablesize=1024;



 //待存储图像数据每行字节数为4的倍数

 int lineByte=(width * biBitCount/8+3)/4*4;

 

 //以二进制写的方式打开文件

 FILE *fp=fopen(bmpName,"wb");

 if(fp==0) return 0;

 

 //申请位图文件头结构变量,填写文件头信息

 BITMAPFILEHEADER fileHead;

 fileHead.bfType = 0x4D42;//bmp类型

 

 //bfSize是图像文件4个组成部分之和

 fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)

  + colorTablesize + lineByte*height;

 fileHead.bfReserved1 = 0;

 fileHead.bfReserved2 = 0;

 

 //bfOffBits是图像文件前三个部分所需空间之和

 fileHead.bfOffBits=54+colorTablesize;

 

 //写文件头进文件

 fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);

 

 //申请位图信息头结构变量,填写信息头信息

 BITMAPINFOHEADER head;

 head.biBitCount=biBitCount;

 head.biClrImportant=0;

 head.biClrUsed=0;

 head.biCompression=0;

 head.biHeight=height;

 head.biPlanes=1;

 head.biSize=40;

 head.biSizeImage=lineByte*height;

 head.biWidth=width;

 head.biXPelsPerMeter=0;

 head.biYPelsPerMeter=0;

 //写位图信息头进内存

 fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);

 

 //如果灰度图像,有颜色表,写入文件

 if(biBitCount==8)

  fwrite(pColorTable, sizeof(RGBQUAD),256, fp);

 

 //写位图数据进文件

 fwrite(imgBuf, height*lineByte, 1, fp);

 

 //关闭文件

 fclose(fp);

 

 return 1;

}





//调色板与灰度图像的关系

void main()

{

 //读入指定BMP文件进内存

 char readPath[]="tarret.BMP";

 readBmp(readPath);



 //输出图像的信息

 printf("width=%d,height=%d,biBitCount=%d\n",bmpWidth,bmpHeight,biBitCount);



 //改变灰度图像的颜色表蓝色分量的值,察看前后变化

 if(biBitCount==8){

  for(int i=0; i<256;i++){

   pColorTable[i].rgbBlue = 255-pColorTable[i].rgbBlue;

  }

 }





 //将图像数据存盘

 char writePath[]="tarret1.BMP";

 saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);



 //清除缓冲区,pBmpBufpColorTable是全局变量,在文件读入时申请的空间

 delete []pBmpBuf;

 if(biBitCount==8)

  delete []pColorTable;

}

#include "stdio.h"

#include "Windows.h"

BYTE *pBmpBuf;//¨¢¨?ª??ºyYÌ???

int bmpWidth;//ª??Ì?¨ª

int bmpHeight;//ª??Ì??

RGBQUAD *pColorTable;//?¦?À¨ª??

int biBitCount;//ª??¤¨¤¨ª

bool readBmp(char *bmpName)

{

FILE *fp=fopen(bmpName,"rb"); //t??¨¢¤?º?䨰a?¡§Ì?ª???t

if(fp==NULL) return 0;

fseek(fp, sizeof(BITMAPFILEHEADER),0); //¬?y?ª??tª¡¤¨¢1BITMAPFILEHEADER

BITMAPINFOHEADER head; //¡§°??ª??¡éª¡¤¨¢1À?¢?ê?¨¢¨??ª??¡éª¡¤?¨²ä?ê?ä?¤?¨²À?¢?headD

fread(&head, sizeof(BITMAPINFOHEADER), 1,fp);

bmpWidth = head.biWidth; //?¨?ª??¨ª¡é?¡é???¨´??ºy̨¨?¡é

bmpHeight = head.biHeight;

biBitCount = head.biBitCount;

int lByte=(bmpWidth * biBitCount/8+3)/4*4; //¡§°?À?¢?ê???ª???D??¨´?Ì?Á?¨²ºy

/* if(biBitCount==8){

pColorTable=new RGBQUAD[256];

fread(pColorTable,sizeof(RGBQUAD),256,fp);

}*/

pBmpBuf=new BYTE[lByte * bmpHeight]; //¦¨º??ª?ºyY¨´¨¨°aÌ???ê?¨¢?ª?ºyY?¨²ä?

fread(pBmpBuf,1,lByte * bmpHeight,fp);

fclose(fp); //?À??t

return 1;

}

bool saveBmp(char *bmpName, BYTE *imgBuf, int width, int height,

int biBitCount, RGBQUAD *pColorTable)

{

if(!imgBuf)

return 0;

int colorTablesize=0; //?¦?À¨ªä¨®?,°?Á?¨²aÌ£¤?,¨°¨¨ª???¦?À¨ªa1024Á?¨²,¨º¦?ª???¦?À¨ªä¨®?a0

/* if(biBitCount==8)

colorTablesize=1024;*/

int lByte=(width * biBitCount/8+3)/4*4; //äyä?ä¡éª??ºyY?DÁ?¨²ºy

FILE *fp=fopen(bmpName,"wb"); //°?t??¡äÌ?¤?º?䨰a?t

if(fp==NULL) return 0;

//¦¨º??ª??tª¡¤¨¢1À?¢?ê?¬?¡ä?tª¡¤?¡é

BITMAPFILEHEADER fileHead;

fileHead.bfType = 0x4D42;//bmp¤¨¤¨ª

//bfSizeº?ª???t4?Á¨¦¨¦?¤??¨ª

fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + colorTablesize + lByte*height;

fileHead.bfReserved1 = 0;

fileHead.bfReserved2 = 0;

//bfOffBitsº?ª???t¡ã¨y??¤?¨´¨¨???¨ª

fileHead.bfOffBits=54+colorTablesize;

fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp); //¡ä?tª¡¤??t

BITMAPINFOHEADER head; //¦¨º??ª??¡éª¡¤¨¢1À?¢?ê?¬?¡ä?¡éª¡¤?¡é

head.biBitCount=biBitCount;

head.biClrImportant=0;

head.biClrUsed=0;

head.biCompression=0;

head.biHeight=height;

head.biPlanes=1;

head.biSize=40;

head.biSizeImage=lByte*height;

head.biWidth=width;

head.biXPelsPerMeter=0;

head.biYPelsPerMeter=0;

fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp); //¡ä?ª??¡éª¡¤?¨²ä?

fwrite(imgBuf, height*lByte, 1, fp); //¡ä?ª?ºyY??t

fclose(fp); //?À??t

return 1;

}

bool rgb_to_yuv(BYTE *imgBuf, int width, int height){

int i=0,j=0;

for( i=0;i< height;i++ ){

for( j=0;j

int pos = width * i + j; // ??Ì???

BYTE B = imgBuf[pos*3];

BYTE G = imgBuf[pos*3+1];

BYTE R = imgBuf[pos*3+2];

BYTE Y= (BYTE)(0.3*R + 0.59*G + 0.11*B);

BYTE U= (BYTE)((B-Y) * 0.493);

BYTE V= (BYTE)((R-Y) * 0.877);

Y=Y+10;

B= (BYTE)(Y + 2.032*U);

G= (BYTE)(Y - 0.394*U - 0.581*V);

R= (BYTE)(Y + 1.140*V);

imgBuf[pos*3]=B;

imgBuf[pos*3+1]=G;

imgBuf[pos*3+2]=R;

}

}

return 1;

}

void main(int argc,char *argv[])

{

char readPath[]="C:\\1.BMP";

readBmp(readPath); //¨¢¨??¡§BMP?t

printf("width=%d,height=%d,biBitCount=%d\n",bmpWidth,bmpHeight,biBitCount); //º??ª??Ì??¡é

char writePath[]="C:\\tarret1.BMP"; //?ª??ºyYä?¨¬

saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);

delete []pBmpBuf; //?yo??ê?pBmpBuf¨ªpColorTableº?¨??À?¢?ê?¨²?t¨¢¨?º¡À¦¨º?Ì???

if(biBitCount==8)

delete []pColorTable;

scanf("%d");

}

本文来源:https://www.2haoxitong.net/k/doc/5436ba16a216147917112809.html

《VC中保存BMP位图文件的方法及BMP文件格式带源码实现.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式