/*************************************************************************
该函数用来镜像DIB图像。可以指定镜像的方式是水平还是垂直。
************************************************************************/
BOOL WINAPI MirrorDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, BOOL bDirection)
{
// 指向源图像的指针
LPSTR lpSrc;
// 指向要复制区域的指针
LPSTR lpDst;
// 指向复制图像的指针
LPSTR lpBits;
HLOCAL hBits;
// 循环变量
LONG i;
LONG j;
// 图像每行的字节数
LONG lLineBytes;
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
// 暂时分配内存,以保存一行图像
hBits = LocalAlloc(LHND, lLineBytes);
if (hBits == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpBits = (char * )LocalLock(hBits);
// 判断镜像方式
if (bDirection)
{
// 水平镜像
// 针对图像每行进行操作
for(i = 0; i < lHeight; i++)
{
// 针对每行图像左半部分进行操作
for(j = 0; j < lWidth / 2; j++)
{
// 指向倒数第i行,第j个象素的指针
lpSrc = (char *)lpDIBBits + lLineBytes * i + j;
// 指向倒数第i行,倒数第j个象素的指针
lpDst = (char *)lpDIBBits + lLineBytes * (i + 1) - j;
// 备份一个象素
*lpBits = *lpDst;
// 将倒数第i行,第j个象素复制到倒数第i行,倒数第j个象素
*lpDst = *lpSrc;
// 将倒数第i行,倒数第j个象素复制到倒数第i行,第j个象素
*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;
}
void CMyDIPView::OnMenuitem32778()
{
// 水平镜像
// 获取文档
CMyDIPDoc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的水平镜像,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的水平镜像!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光标形状
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 调用MirrorDIB()函数水平镜像DIB
if (MirrorDIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), TRUE))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
void CMyDIPView::OnMenuitem32779()
{
// 水平镜像
// 获取文档
CMyDIPDoc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
// 指向DIB象素指针
LPSTR lpDIBBits;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的水平镜像,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的水平镜像!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 更改光标形状
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 调用MirrorDIB()函数水平镜像DIB
if (MirrorDIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), FALSE))
{
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
}
阅读(672) | 评论(0) | 转发(0) |