在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;
}
//镜像处理
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;
}
相关文章推荐
- 图像灰度化方法总结及其VC实现 .
- 在11g中使用ASM功能实现两个存储做镜像的方法
- 24位真彩色图像转换为16位高彩色图像的实现方法及效果改进
- 图像滤波常见方法原理总结及VC下实现
- 图像滤波常见方法原理总结及VC下实现
- 图像灰度化方法总结及其VC实现
- 图像灰度化方法总结及其VC实现
- 图像滤波常见方法原理总结及VC下实现
- arraycopy方法(实现两个数组之间固定位置的相互转换)
- Ubuntu系统上实现转换图像、音频和视频格式的方法
- 【转】图像灰度化方法总结及其VC实现
- VC实现多格式图像的转换
- 图像滤波常见方法原理总结及VC下实现
- php实现将wav文件转换成图像文件并在页面中显示的方法
- 图像滤波常见方法原理总结及VC下实现
- C#结合GDAL使用Band的ReadRaster和WriteRaster方法实现3波段图像水平镜像
- python图像处理之镜像实现方法
- matlab实现将彩色图像转换成灰色图像的方法
- 图像灰度化方法总结及其VC实现
- (原创)用verilog实现RGB格式图像到YCbCr或YUV格式的转换及其验证方法 (RGB2YCrCb)(RGB2YUV)