您的位置:首页 > 其它

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

2009-08-07 10:17 344 查看
具体的代码如下:

//镜像处理
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: