在vc中实现DIB图像镜像转换的两个方法

来源:互联网 发布:网络借贷不还会怎么样 编辑:程序博客网 时间:2024/06/05 22:34

具体的代码如下:

//镜像处理
BOOL ImageMirror(LPSTR lpDIBBits,LONG lWidth,LONG lHeight,BOOL V_H)
{
 //方法一
 LPSTR lpSrc;//指向原位图的指针
 LPSTR lpDupArea;//指向要复制区域的指针
 LPSTR lpDupDib;//指向复制图像的指针
 LONG lLineBytes=WIDTHBYTES(lWidth*8);
 HLOCAL hBits=LocalAlloc(LHND,lLineBytes);//暂时分配内存,以保存一行图像
 if (hBits==NULL) {
  return FALSE;
 }
 lpDupDib=(LPSTR)LocalLock(hBits);//锁定内存
 LONG i,j;
 if (V_H) {//水平镜像
  for(i=0;i<lHeight;i++)
  {
   for(j=0;j<lWidth/2;j++)
   {
    lpSrc=(LPSTR)lpDIBBits+lLineBytes*i+j;// 指向倒数第i行,第j个象素的指针
    lpDupArea=(LPSTR)lpDIBBits+lLineBytes*(i+1)-j;// 指向倒数第i行,倒数第j个象素的指针
    *lpDupDib=*lpDupArea;
    *lpDupArea=*lpSrc;
    *lpSrc=*lpDupDib;
   }
  }
 }
 else{//垂直镜像
  for(i=0;i<lHeight/2;i++){
   lpSrc=(LPSTR)lpDIBBits+lLineBytes*i;// 指向倒数第i行
   lpDupArea=(LPSTR)lpDIBBits+lLineBytes*(lHeight-1-i);// 指向第i行
   memcpy(lpDupDib,lpDupArea,lLineBytes);
   memcpy(lpDupArea,lpSrc,lLineBytes);
   memcpy(lpSrc,lpDupDib,lLineBytes);
  }
 }
 ::LocalUnlock(hBits);
 LocalFree(hBits);
 //方法二
    LPSTR lpDstStartBits;//指向复制图像的起始像素
 LPSTR lpDstDibBits;//指向复制图像的指针
 LPSTR lpSrcDibBits;//指向源图像的指针
    long lLineBytes=WIDTHBYTES(lWidth*8);//每行的字节数
 HLOCAL hDstDibBits=LocalAlloc(LHND,lHeight*lLineBytes);//暂时分配内存
 lpDstStartBits=(LPSTR)LocalLock(hDstDibBits);//锁定内存  
 //临时指针,指向变换后的数据
 if (hDstDibBits==NULL){
  return false;
 }
 for(int i=0 ;i<lHeight;i++)
 {
  for(int j=0;j<lWidth;j++)
  {
   //指向临时dib中的第i行,第j列像素的指针
   lpDstDibBits=(LPSTR)lpDstStartBits+lLineBytes*(lHeight-1-i)+j ;
   if(V_H==FALSE)//垂直镜像
   {
    lpSrcDibBits=(LPSTR)lpDIBBits+lLineBytes*i+j;//指向倒数第i行,第j列
   }
   else if(V_H==TRUE)//水平镜像
   {
    lpSrcDibBits=(LPSTR)lpDIBBits+lLineBytes*(lHeight-1-i)+lWidth-1-j;
   }
   *lpDstDibBits=*lpSrcDibBits;//复制像素
  }
 }
 
 memcpy(lpDIBBits,lpDstStartBits,lLineBytes*lHeight);
 LocalUnlock(hDstDibBits);
 LocalFree(hDstDibBits); 
 return TRUE;
}

原创粉丝点击