19,468
社区成员
发帖
与我相关
我的任务
分享
void CPartialBitmapView::MergePartialBmp(char *MergeFile,char *MergedFile)
{
// 1st get MergedFile's bits.
FILE *bmpDst=0;
bmpDst=fopen(MergedFile,"rb");
if(!bmpDst)
{
AfxMessageBox("MergedFile Lost!");
CreateEmptyMergedFile(MergedFile);
}
// reopen
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->biBitCount==8)
{
colord=256;
}
// 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=0;
bmpSrc=fopen(MergeFile,"rb");
if(!bmpSrc)
{// check "tmp.bmp"
AfxMessageBox("No Source file!");
SavePartialBmp(m_Tracker.m_rect.left,m_Tracker.m_rect.top,m_Tracker.m_rect.right,
m_Tracker.m_rect.bottom);
}
// reopen
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;//
if(pBMPinfoSrc->biBitCount==8)
{
colors=256;
}
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
if(colors==256)
{
memcpy(rgbDst,rgbSrc,colors*sizeof(RGBQUAD));
}
int BPP=pBMPinfoDst->biBitCount/8;
// now copy bits
for(int hei=Yend-1;hei >= Ystart;hei--)// vertical flip
{//
for(int wid=Xstart;wid < Xend;wid++)
{
// bitsDstAt[ (heiDst-hei-1)*widDst+wid] =bitsSrcAt[ (heiSrc-1-(hei-Ystart))*widSrc+(wid-Xstart)];//
bitsDstAt[((heiDst-1-hei)*widDst+wid)*BPP]=bitsSrcAt[((heiSrc-1-(hei-Ystart))*widSrc+(wid-Xstart))*BPP];//
if(BPP>=3)
{// 24
bitsDstAt[((heiDst-1-hei)*widDst+wid)*BPP+1]=bitsSrcAt[((heiSrc-1-(hei-Ystart))*widSrc+(wid-Xstart))*BPP+1];//
bitsDstAt[((heiDst-1-hei)*widDst+wid)*BPP+2]=bitsSrcAt[((heiSrc-1-(hei-Ystart))*widSrc+(wid-Xstart))*BPP+2];//
}
if(BPP==4)
bitsDstAt[((heiDst-1-hei)*widDst+wid)*BPP+3]=bitsSrcAt[((heiSrc-1-(hei-Ystart))*widSrc+(wid-Xstart))*BPP+3];//
}
}
// write back
bmpDst=fopen(MergedFile,"wb");
fwrite(bufferDst,1,filelenDst,bmpDst);
fclose(bmpDst);
//
if(bufferSrc) delete [] bufferSrc;
if(bufferDst) delete [] bufferDst;
//
AfxMessageBox("Bmp Merged!");
}
1 被merge的文件的位置在
// merging pos
int Xstart=pBMPfileSrc->bfReserved1;
int Ystart=pBMPfileSrc->bfReserved2;
2 那个包含所有 merge 文件本身 必须 先创建(足够大,带调色板)