16,472
社区成员
发帖
与我相关
我的任务
分享
//left,top,right,down
//input file 'clouds.bmp' 640,480,256
//output file 'tmp.bmp'
void CDrawbmpView::SavePartialBmp(int Xstart,int Ystart,int Xend,int Yend)
{
FILE *bmp;
bmp=fopen("clouds.BMP","rb");
fseek(bmp,0L,SEEK_END);
LONG filelen=ftell(bmp);
fseek(bmp,0L,SEEK_SET);
BYTE *buffer=new BYTE[filelen];
fread(buffer,sizeof(char),filelen,bmp);
fclose(bmp);
//
LPBITMAPFILEHEADER pBMPfile=(LPBITMAPFILEHEADER) buffer;
LPBITMAPINFOHEADER pBMPinfo=(LPBITMAPINFOHEADER) (buffer+sizeof(BITMAPFILEHEADER));
int colors=0;//
// if(pBMPinfo->biClrUsed != 256 || pBMPinfo->biClrUsed ==0)
colors=1 << pBMPinfo->biBitCount;//1<<8
if(colors != 256 ) return;
//width
WORD width=(WORD)pBMPinfo->biWidth;
BYTE rest;
rest=width %4;
if( rest != 0) width += 4-rest;
//
WORD height=(WORD)pBMPinfo->biHeight;
BYTE *bitsAt=buffer+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colors*sizeof(RGBQUAD);//=4;
//
RGBQUAD *rgb=(RGBQUAD*)(buffer+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
// check edges
if(Xstart < 0 ) Xstart=0;
if(Xend > width ) Xend=width;
if(Xend <= Xstart ) return;
//
if(Ystart < 0 ) Ystart=0;
if(Yend > height ) Yend=height;
if(Yend <= Ystart ) return;
// new width
WORD tmpWid=Xend-Xstart;
rest=tmpWid %4;
if( rest != 0)
{// new end
tmpWid += 4-rest;
if(Xend==width) Xstart=Xend-tmpWid;
else Xend=Xstart+tmpWid;
}
WORD tmpHei=Yend-Ystart;
// get new bits
BYTE *tmpBits=new BYTE[tmpWid*tmpHei];
for(int hei=Ystart;hei < Yend;hei++)
{
for(int wid=Xstart;wid < Xend;wid++)
{//vertical flip
tmpBits[(Yend-1-hei)*tmpWid+wid-Xstart]=bitsAt[(height-1-hei)*width+wid];
}
}
//
FILE *fp;
fp = fopen("tmp.bmp","wb");
// header
pBMPfile->bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+
colors * sizeof(RGBQUAD)+tmpWid*tmpHei;
fwrite(pBMPfile, 1, sizeof(BITMAPFILEHEADER), fp);
// info header
pBMPinfo->biWidth=tmpWid;
pBMPinfo->biHeight=tmpHei;
pBMPinfo->biSizeImage=tmpWid*tmpHei;
fwrite(pBMPinfo, 1, sizeof(BITMAPINFOHEADER),fp);
// Pallete
fwrite(rgb, 1, colors * sizeof(RGBQUAD),fp);
// dibs
fwrite(tmpBits,1,tmpWid*tmpHei,fp);
fclose(fp);
// free
if(tmpBits) delete [] tmpBits;
if(buffer) delete [] buffer;
}