|
|
BMP文件的biHeight为负值则表示图像为uper-left开始,为正则是lower-left开始,所以偶作了个很简单的倒转BMP文件的程序,结果出问题咧
#include <windows.h>
#include <stdio.h>
bool TransBmp(char* SrcName,char* DestName)
{
//打开文件
FILE *fileSrc;
FILE *fileDest;
if(NULL==(fileSrc=fopen(SrcName,"r")))
return false;
//读文件头
BITMAPFILEHEADER fileHeader;
fread(&fileHeader,sizeof(fileHeader),1,fileSrc);
if(fileHeader.bfType!=0x4d42)
return false;
//读信息头
BITMAPINFOHEADER infoHeader;
fread(&infoHeader,sizeof(infoHeader),1,fileSrc);
//16色,256色时 读调色板
RGBQUAD* quad=NULL;
int N_COLOR;
if(infoHeader.biBitCount==4||infoHeader.biBitCount==8)
{
N_COLOR = 1<<infoHeader.biBitCount;
quad = new RGBQUAD[N_COLOR];
fseek(fileSrc,fileHeader.bfOffBits-sizeof(RGBQUAD)*N_COLOR,0);
fread(quad,sizeof(RGBQUAD),N_COLOR,fileSrc);
}
else
N_COLOR=0;
//读数据信息
fseek(fileSrc,fileHeader.bfOffBits,0);
unsigned char* buffer=new unsigned char[fileHeader.bfSize-fileHeader.bfOffBits];
fread(buffer,sizeof(unsigned char),
(fileHeader.bfSize-fileHeader.bfOffBits)
,fileSrc);
//关闭源文件
fclose(fileSrc);
//24位色 转换数据
infoHeader.biHeight= -infoHeader.biHeight;
fileDest=fopen(DestName,"w");
fwrite(&fileHeader,sizeof(BITMAPFILEHEADER),1,fileDest);
fwrite(&infoHeader,sizeof(BITMAPINFOHEADER),1,fileDest);
if(N_COLOR>0)
{
fwrite(quad,sizeof(RGBQUAD),N_COLOR,fileDest);
}
fseek(fileDest,fileHeader.bfOffBits,0);
fwrite(buffer,sizeof(unsigned char),
//infoHeader.biSizeImage
(fileHeader.bfSize-fileHeader.bfOffBits)
,fileDest);
fclose(fileDest);
if(buffer) delete []buffer;
if(quad) delete []quad;
}
void main()
{
TransBmp("1.bmp","2.bmp");
} |
|