http://www.china-vision.net/blog/user1/8/index.html
时间记忆
最新评论
我的公告
我的相册
最新留言
我的好友
用户登陆
友情链接
博客信息



日志
毕业前笔记整理-VC++图像处理(三)  | 2007-5-29 18:35:00
接着上面的总结,基于VC++的图像合并,请耐心。。。。。

1.       合并两幅256BMP位图  左高右低

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("打开的位图不是8BMP文件!");

         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); } }
。。。。。。
阅读全文 | 回复(0) | 引用通告 | 编辑 | By: 蓝云杨
  • 标签:图像处理 
  • 发表评论:
    Design by blog.nfhot.com / Copyright http://nfhot.com 2006-2008 reserved
    Powered by Oblog.