| 接着上面的总结,基于VC++的图像合并,请耐心。。。。。
1. 合并两幅256色BMP位图 左高右低
void BMP2(LPCTSTR pLeftFile,LPCTSTR pRightFile)
{ CFile leftFile,rightFile;
CFileException fe1,fe2;
if (!leftFile.Open(pLeftFile,C:modeRead,&fe1)){ return;}
if (!rightFile.Open(pRightFile,C:modeRead,&fe2)){ return;}
DWORD dwLeftBitsSize=leftFile.GetLength();
DWORD dwRightBitsSize=rightFile.GetLength();
HGLOBAL hLeftImageBuf=GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,dwLeftBitsSize); //为左图分配内存
if (!hLeftImageBuf){ leftFile.Close(); return;}
HGLOBAL hRightImageBuf=GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,dwRightBitsSize); //为右图分配内存
if (!hRightImageBuf){ rightFile.Close(); return;}
LPSTR lpLeftImage=(LPSTR)GlobalLock(hLeftImageBuf);
LPSTR lpRightImage=(LPSTR)GlobalLock(hRightImageBuf);
DWORD leftLen=0;
DWORD rightLen=0;
leftLen=leftFile.Read(lpLeftImage,dwLeftBitsSize); //读取左图数据
if (leftLen < dwLeftBitsSize){
if (hLeftImageBuf != NULL){
GlobalUnlock(hLeftImageBuf);
GlobalFree(hLeftImageBuf);}
leftFile.Close(); return;}
rightLen=rightFile.Read(lpRightImage,dwRightBitsSize); //读取右图数据
if (rightLen < dwRightBitsSize){
if (hRightImageBuf != NULL){
GlobalUnlock(hRightImageBuf);
GlobalFree(hRightImageBuf);}
rightFile.Close(); return;}
LPBITMAPFILEHEADER lpLeftfhdr=(LPBITMAPFILEHEADER)lpLeftImage; //位图文件头
LPBITMAPINFOHEADER lpLeftbmpinfo=(LPBITMAPINFOHEADER)(lpLeftImage+sizeof(BITMAPFILEHEADER)); //位图信息头
LPBITMAPFILEHEADER lpRightfhdr=(LPBITMAPFILEHEADER)lpRightImage; //位图文件头
LPBITMAPINFOHEADER lpRightbmpinfo=(LPBITMAPINFOHEADER)(lpRightImage+sizeof(BITMAPFILEHEADER)); //位图信息头
if (lpLeftbmpinfo->biBitCount!=8 || lpRightbmpinfo->biBitCount!=8) //判断是否为8位位图
{ MessageBox("打开的位图不是8位BMP文件!");
GlobalUnlock(hLeftImageBuf);
GlobalFree(hLeftImageBuf);
GlobalUnlock(hRightImageBuf);
GlobalFree(hRightImageBuf);
leftFile.Close();
rightFile.Close(); return;}
int newWidth,newHeight;
BOOL leftHeighter, rightHeighter;
leftHeighter = FALSE;
rightHeighter = FALSE;
int leftWidth,leftHeight,rightWidth,rightHeight; //左右图像的宽度和高度
int i,j,k,l; k=0; l=0;
int leftLineBytes=0; //左边图像每行的字节数
int rightLineBytes=0; //右边图像每行的字节数
int mergeLineBytes=0; //合并图像每行的字节数
leftWidth = lpLeftbmpinfo->biWidth; //左图宽度
leftHeight = lpLeftbmpinfo->biHeight; //左图高度
rightWidth = lpRightbmpinfo->biWidth; //右图宽度
rightHeight = lpRightbmpinfo->biHeight; //左图高度
if(leftWidth%4!=0){ leftLineBytes = leftWidth+leftWidth%4;}
else{ leftLineBytes = leftWidth;}
if(rightWidth%4!=0){ rightLineBytes = rightWidth+rightWidth%4;}
else{ rightLineBytes = rightWidth;}
//按左右合并
newWidth = leftWidth + rightWidth; //合并图像的宽度
if (leftHeight >= rightHeight){ newHeight = leftHeight; //取高度较大者作为合并图像的高度
leftHeighter = TRUE;}
else{ newHeight = rightHeight; rightHeighter = TRUE;}
//为合并图像分配内存,存储大小为newWidth*newHeight
HGLOBAL hMergeDIB=GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,newWidth*newHeight);
LPSTR lpMerge=(LPSTR)GlobalLock(hMergeDIB);
int temp=0;
LPBITMAPFILEHEADER lpMergefhdr=(LPBITMAPFILEHEADER)lpLeftImage; //位图文件头
LPBITMAPINFOHEADER lpMergebmpinfo=(LPBITMAPINFOHEADER)(lpLeftImage+sizeof(BITMAPFILEHEADER)); //位图信息头
lpMergebmpinfo->biWidth = newWidth;
lpMergebmpinfo->biHeight = newHeight;
if(newWidth%4!=0){ mergeLineBytes = newWidth+newWidth%4;}
else{ mergeLineBytes = newWidth;}
unsigned char *leftimage=new unsigned char[leftWidth*leftHeight];
unsigned char *rightimage=new unsigned char[rightWidth*rightHeight];
for(i=0;i<leftHeight;i++)
{ for (j=0;j<leftLineBytes;j++){
leftimage[i*leftLineBytes+j]=(unsigned char)*(lpLeftImage+lpLeftfhdr->bfOffBits+leftLineBytes*i+j);} }
for(i=0;i<rightHeight;i++) {
for (j=0;j<rightLineBytes;j++) {
rightimage[i*rightLineBytes+j]=(unsigned char)*(lpRightImage+lpRightfhdr->bfOffBits+rightLineBytes*i+j); } }
。。。。。。 |