19,468
社区成员
发帖
与我相关
我的任务
分享
void CPartialBitmapView::MergePartialBmp(char *MergeFile,char *MergedFile)
{// 1st get MergedFile's bits.
FILE *bmpDst;
bmpDst=fopen(MergedFile,"rb");
fseek(bmpDst,0L,SEEK_END);
LONG filelenDst=ftell(bmpDst);
fseek(bmpDst,0L,SEEK_SET);
BYTE *bufferDst=new BYTE[filelenDst];
fread(bufferDst,sizeof(char),filelenDst,bmpDst);
fclose(bmpDst);
//
LPBITMAPFILEHEADER pBMPfileDst=(LPBITMAPFILEHEADER) bufferDst;
LPBITMAPINFOHEADER pBMPinfoDst=(LPBITMAPINFOHEADER) (bufferDst+sizeof(BITMAPFILEHEADER));
int colord=0;//
// if(pBMPinfoDst->biClrUsed != 256 || pBMPinfoDst->biClrUsed ==0)
colord=1 << pBMPinfoDst->biBitCount;//1<<8
if(colord != 256 ) return;
// width height and bits
WORD widDst=(WORD)pBMPinfoDst->biWidth;// 640
WORD heiDst=(WORD)pBMPinfoDst->biHeight;// 480
BYTE *bitsDstAt=bufferDst+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colord*sizeof(RGBQUAD);//=4;
RGBQUAD *rgbDst=(RGBQUAD*)(bufferDst+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
//// 2nd get MergeFile's bits. ///////////////////////////////////////////////
FILE *bmpSrc;
bmpSrc=fopen(MergeFile,"rb");
fseek(bmpSrc,0L,SEEK_END);
LONG filelenSrc=ftell(bmpSrc);// 17462
fseek(bmpSrc,0L,SEEK_SET);
BYTE *bufferSrc=new BYTE[filelenSrc];
fread(bufferSrc,sizeof(char),filelenSrc,bmpSrc);
fclose(bmpSrc);
//
LPBITMAPFILEHEADER pBMPfileSrc=(LPBITMAPFILEHEADER) bufferSrc;
LPBITMAPINFOHEADER pBMPinfoSrc=(LPBITMAPINFOHEADER) (bufferSrc+sizeof(BITMAPFILEHEADER));
// merging pos
int Xstart=pBMPfileSrc->bfReserved1;
int Ystart=pBMPfileSrc->bfReserved2;
afxDump << Xstart << ";" << Ystart << "\n";// 256;192
int colors=0;//
colors=1 << pBMPinfoSrc->biBitCount;//1<<8
if(colors != 256 ) return;
//
WORD widSrc=(WORD)pBMPinfoSrc->biWidth;// 128
WORD heiSrc=(WORD)pBMPinfoSrc->biHeight;// 128
WORD Xend=Xstart+widSrc;
WORD Yend=Ystart+heiSrc;
afxDump << Xend << ";" << Yend << "\n";// 384;320
//
BYTE *bitsSrcAt=bufferSrc+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colors*sizeof(RGBQUAD);
// Pallete
RGBQUAD *rgbSrc=(RGBQUAD*)(bufferSrc+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
// copy Pallete
memcpy(rgbDst,rgbSrc,colors*sizeof(RGBQUAD));
// now copy bits
for(int hei=Yend-1;hei >= Ystart;hei--)// vertical flip
{// 192 320
for(int wid=Xstart;wid < Xend;wid++)
{
bitsDstAt[(heiDst-hei-1)*widDst+wid]=bitsSrcAt[(heiSrc-1-(hei-Ystart))*widSrc+(wid-Xstart)];//
}
}
// write back
bmpDst=fopen(MergedFile,"wb");
fwrite(bufferDst,1,filelenDst,bmpDst);
fclose(bmpDst);
//
if(bufferSrc) delete [] bufferSrc;
if(bufferDst) delete [] bufferDst;
//
}
分割程序参考
“PartialBitmap.zip”
http://download.csdn.net/detail/schlafenhamster/4526898
“不使用CDC直接裁剪Bitmap文件。 主要函数 SavePartialBmp(int Xstart,int Ystart,int Xend,int Yend)”