5,530
社区成员




//对24位的上下,左右镜面,true 左右对称
byte *bmData=NULL;
void Ontrun(bool bLeftRight, BITMAPINFO *bmif, BITMAPFILEHEADER &bmfh)
{
byte * bEddyData=NULL ;
int byteCount= bmif->bmiHeader.biBitCount/8;
bEddyData = new byte[bmfh.bfSize-bmfh.bfOffBits];
int iBmpAddLineData = (4-bmif->bmiHeader.biWidth * byteCount % 4) % 4;
//对数据进行操作
int iImageSize = (bmif->bmiHeader.biWidth * byteCount + iBmpAddLineData) * bmif->bmiHeader.biHeight;
for( int i =0; i<bmif->bmiHeader.biHeight ;i++)
{
int m =0;
for( int j=0; j<bmif->bmiHeader.biWidth * byteCount; j+=byteCount)
{
int bmDataIndex;
int bEddyDataRowIndex;
int bEddyDataColIndex;
int locIndex;
if(bLeftRight)
{
bmDataIndex = (bmif->bmiHeader.biWidth*byteCount+iBmpAddLineData)*i;
bEddyDataRowIndex = i*((bmfh.bfSize-bmfh.bfOffBits)/bmif->bmiHeader.biHeight);
bEddyDataColIndex = (bmif->bmiHeader.biWidth-1-m)*byteCount;
locIndex =bEddyDataRowIndex+bEddyDataColIndex;
}
else
{
bmDataIndex = (bmif->bmiHeader.biWidth * byteCount + iBmpAddLineData ) * i;
bEddyDataRowIndex = (bmif->bmiHeader.biHeight -1-i)*((bmfh.bfSize-bmfh.bfOffBits)/bmif->bmiHeader.biHeight);
bEddyDataColIndex = (m)*byteCount;
locIndex =bEddyDataRowIndex+bEddyDataColIndex;
}
bEddyData[locIndex] = bmData[j+bmDataIndex]; //B
bEddyData[locIndex+1] = bmData[j+bmDataIndex+1]; //G
bEddyData[locIndex+2] = bmData[j+bmDataIndex+2]; //R
m++;
}
}
byte * bTemp = bmData;
bmData = bEddyData;
//删除临时信息
delete bTemp;
}
int main()
{
//byte * bmData=NULL; //bmp图像数据
BITMAPFILEHEADER fileheader;
BITMAPINFO info;
FILE *fp=fopen("C://test.bmp","r");
if (NULL==fp)
return -1;
//文件头
fread(&fileheader, sizeof(fileheader), 1, fp);
if (fileheader.bfType!=0x4D42)//不是BMP图片
{
fclose(fp);
return -1;
}
//信息头
fread(&info.bmiHeader, sizeof(BITMAPINFOHEADER), 1, fp);
//位图宽度和高度
long height=info.bmiHeader.biWidth;
long wide=info.bmiHeader.biHeight;
//宽字节
int widthByte=(info.bmiHeader.biWidth * info.bmiHeader.biBitCount + 31)/32 *3 ;
DWORD size;
if (info.bmiHeader.biClrUsed!=0)
size=info.bmiHeader.biSizeImage;//带颜色表
else
size=height * widthByte; //不带颜色表
if (NULL!=bmData)
{
delete [] bmData;
bmData=NULL;
}
bmData = new byte[size];
if (bmData==NULL)
return -1;
fseek(fp, fileheader.bfOffBits,0);
fread(bmData, size, 1 ,fp);
fclose(fp);
//Ontrun(false, &info, fileheader);//转化数据
FILE *fp1;
fp1=fopen("C:\\test1.bmp","w");
fwrite(&fileheader, sizeof(fileheader), 1, fp1);
fwrite(&info.bmiHeader, sizeof(BITMAPINFOHEADER), 1,fp1);
fwrite(bmData, size, 1, fp1);
fclose(fp1);
return 0;
}