如何水平镜象图象

whn 2003-11-18 11:57:31
我想对24位真彩的bmp图象的数据部分缓冲进行水平镜象
比如
void xmirror(BYTE* pInbuf,BYTE* pOutbuf,int nWidth,int nHeight);
其中pInbuf是原始的图象的数据部分缓冲
pOutbuf是镜象后的数据部分缓冲
nWidth,nHeight是图象的宽和高

...全文
109 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
shally5 2003-11-18
  • 打赏
  • 举报
回复
再学
wrcluomo 2003-11-18
  • 打赏
  • 举报
回复
/*************************************************************************
*
* 函数名称:
* MirrorDIB()
*
* 参数:
* LPSTR lpDIBBits - 指向源DIB图像指针
* LONG lWidth - 源图像宽度(象素数)
* LONG lHeight - 源图像高度(象素数)
* BOOL bDirection - 镜像的方向,TRUE表示水平镜像,FALSE表示垂直镜像
* int nImageBits -图像的位数
*
* 返回值:
* BOOL - 镜像成功返回TRUE,否则返回FALSE。
*
* 说明:
* 该函数用来镜像DIB图像。可以指定镜像的方式是水平还是垂直。
*支持8,24,32位图像
************************************************************************/

BOOL WINAPI MirrorDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, BOOL bDirection,int nImageBits)
{

// 指向源图像的指针
LPSTR lpSrc;

// 指向要复制区域的指针
LPSTR lpDst;

// 指向复制图像的指针
LPSTR lpBits;
HLOCAL hBits;

// 循环变量
LONG i;
LONG j;
int nBits;//每像素占的位数
// 图像每行的字节数
LONG lLineBytes;
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth *nImageBits);
// 暂时分配内存,以保存一行图像
hBits = LocalAlloc(LHND, lLineBytes);
if (hBits == NULL)
{
// 分配内存失败
return FALSE;
}

// 锁定内存
lpBits = (char * )LocalLock(hBits);
int nStep=nImageBits/8;
long lCenter=lWidth/2*nStep;

// 判断镜像方式
if (bDirection)
{
// 水平镜像
// 针对图像每行进行操作
for(i = 0; i < lHeight; i++)
{
// 针对每行图像左半部分进行操作
for(j = 0; j < lCenter; j+=nStep)
{
for(nBits=0;nBits<nStep;nBits++)
{
lpSrc = (char *)lpDIBBits + lLineBytes * i +lCenter- j+nBits;
lpDst = (char *)lpDIBBits + lLineBytes * i +lCenter+ j+nBits;
*lpBits = *lpDst;
*lpDst = *lpSrc;
*lpSrc = *lpBits;
}

}

}
}
else
{
// 垂直镜像
// 针对上半图像进行操作
for(i = 0; i < lHeight / 2; i++)
{

// 指向倒数第i行象素起点的指针
lpSrc = (char *)lpDIBBits + lLineBytes * i;

// 指向第i行象素起点的指针
lpDst = (char *)lpDIBBits + lLineBytes * (lHeight - i - 1);

// 备份一行,宽度为lWidth
memcpy(lpBits, lpDst, lLineBytes);

// 将倒数第i行象素复制到第i行
memcpy(lpDst, lpSrc, lLineBytes);

// 将第i行象素复制到倒数第i行
memcpy(lpSrc, lpBits, lLineBytes);

}
}

// 释放内存
LocalUnlock(hBits);
LocalFree(hBits);
// 返回
return TRUE;
}
供参考。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧